source: branches/work_304/output/ContainerTable.cpp @ 435

Revision 435, 5.1 KB checked in by jls17, 6 years ago (diff)
  • added filtering support to all container list pages
Line 
1//Copyright (C) 2009 Stefan Nerlich | stefan.nerlich@hotmail.com
2//
3//This file is part of ARInside.
4//
5//    ARInside is free software: you can redistribute it and/or modify
6//    it under the terms of the GNU General Public License as published by
7//    the Free Software Foundation, version 2 of the License.
8//
9//    ARInside is distributed in the hope that it will be useful,
10//    but WITHOUT ANY WARRANTY; without even the implied warranty of
11//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12//    GNU General Public License for more details.
13//
14//    You should have received a copy of the GNU General Public License
15//    along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
16
17#include "stdafx.h"
18#include "ContainerTable.h"
19
20using namespace OUTPUT;
21
22CContainerTable::CContainerTable(CARInside &arIn, bool includeObjTypeColumn)
23: CObjectTable("containerList", "TblObjectList")
24{
25        this->pInside = &arIn;
26
27        tbl.AddColumn((includeObjTypeColumn?40:60), "Container Name");
28        if (includeObjTypeColumn)
29        {
30                tbl.AddColumn(20, "Type");
31        }
32        tbl.AddColumn(20, "Modified");
33        tbl.AddColumn(20, "By");
34
35        hasObjTypeColumn = includeObjTypeColumn;
36}
37
38CContainerTable::~CContainerTable(void)
39{
40}
41
42void CContainerTable::AddRow(CARContainer &cont, int rootLevel)
43{
44        CTableRow tblRow("");
45        string cellNameValue = cont.GetURL(rootLevel);
46
47        switch(cont.GetType())
48        {
49        case ARCON_FILTER_GUIDE:
50                {
51                        if(NumRelatedFilters(cont)==0)
52                        {
53                                cellNameValue += " (<b>!</b>)";
54                        }
55                }
56                break;
57        case ARCON_GUIDE:
58                {
59                        if(NumRelatedActiveLinks(cont)==0)
60                        {
61                                cellNameValue += " (<b>!</b>)";
62                        }
63                }
64                break;
65        }
66
67        tblRow.AddCell( CTableCell(cellNameValue));
68        if (this->hasObjTypeColumn) { tblRow.AddCell( CTableCell(CAREnum::ContainerType(cont.GetType()))); }
69        tblRow.AddCell( CTableCell(CUtil::DateTimeToHTMLString(cont.GetTimestamp())));
70        tblRow.AddCell( CTableCell(this->pInside->LinkToUser(cont.GetLastChanged(), rootLevel)));
71        this->tbl.AddRow(tblRow);
72}
73
74// TODO: optimize related workflow scanning
75// The following two methods scan for activelinks and filters calling the current container, just to add a sign
76// to unused containers. The same scanning is done during the container documentation to show all objects calling
77// this guide. The code should be moved to the scanning phase to add all callers to the container. Later we can
78// check if there are no callers an put the sign in front of the object link.
79
80int CContainerTable::NumRelatedActiveLinks(CARContainer &obj)
81{
82        int nResult = 0;
83        try
84        {
85                unsigned int alCount = this->pInside->alList.GetCount();
86                for (unsigned int alIndex = 0; alIndex < alCount; ++alIndex )
87                {
88                        CARActiveLink al(alIndex);
89
90                        // skip this object in case it's overlaid (hidden)
91                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(al))
92                                continue;
93
94                        //Search if-actions
95                        for(unsigned int nAction = 0; nAction < al.GetIfActions().numItems; nAction++)
96                        {
97                                const ARActiveLinkActionStruct &action = al.GetIfActions().actionList[nAction];
98                                if(action.action == AR_ACTIVE_LINK_ACTION_CALLGUIDE)
99                                {
100                                        if(strcmp(action.u.callGuide.guideName, obj.GetARName())==0)
101                                        {
102                                                nResult++;
103                                        }
104                                }                               
105                        }
106
107                        //Search else-actions
108                        for(unsigned int nAction = 0; nAction < al.GetElseActions().numItems; nAction++)
109                        {
110                                const ARActiveLinkActionStruct &action = al.GetElseActions().actionList[nAction];
111                                if(action.action == AR_ACTIVE_LINK_ACTION_CALLGUIDE)
112                                {
113                                        if(strcmp(action.u.callGuide.guideName, obj.GetARName())==0)
114                                        {
115                                                nResult++;
116                                        }
117                                }                               
118                        }
119                }
120        }
121        catch(exception& e)
122        {
123                cout << "EXCEPTION enumerating NumRelatedActiveLinks() in container '" << obj.GetName() << "': " << e.what() << endl;
124        }
125
126        return nResult;
127}
128
129int CContainerTable::NumRelatedFilters(CARContainer &obj)
130{
131        int nResult = 0;
132        try
133        {
134                unsigned int filterCount = pInside->filterList.GetCount();
135                for (unsigned int filterIndex = 0; filterIndex < filterCount; ++filterIndex )
136                {
137                        CARFilter filter(filterIndex);
138
139                        // skip this object in case it's overlaid (hidden)
140                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(filter))
141                                continue;
142
143                        //Search if-actions
144                        for(unsigned int nAction = 0; nAction < filter.GetIfActions().numItems; nAction++)
145                        {
146                                ARFilterActionStruct &action = filter.GetIfActions().actionList[nAction];
147                                if(action.action == AR_FILTER_ACTION_CALLGUIDE)
148                                {
149                                        if(strcmp(action.u.callGuide.guideName, obj.GetARName())==0)
150                                        {
151                                                nResult++;
152                                        }
153                                }                               
154                        }
155
156                        //Search else-actions
157                        for(unsigned int nAction = 0; nAction < filter.GetElseActions().numItems; nAction++)
158                        {
159                                ARFilterActionStruct action = filter.GetElseActions().actionList[nAction];
160                                if(action.action == AR_FILTER_ACTION_CALLGUIDE)
161                                {
162                                        if(strcmp(action.u.callGuide.guideName, obj.GetARName())==0)
163                                        {
164                                                nResult++;
165                                        }
166                                }                               
167                        }
168                }
169        }
170        catch(exception& e)
171        {
172                cout << "EXCEPTION enumerating NumRelatedFilters() in container '" << obj.GetName() << "': " << e.what() << endl;
173        }
174
175        return nResult;
176}
Note: See TracBrowser for help on using the repository browser.