source: branches/work_304/doc/DocCharMenuDetails.cpp @ 679

Revision 475, 17.7 KB checked in by jls17, 6 years ago (diff)
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 "DocCharMenuDetails.h"
19#include "../output/ContainerTable.h"
20#include "DocOverlayHelper.h"
21#include "../core/ARQualification.h"
22
23const char* MenuDefinitionText = "Menu Definition";
24
25CDocCharMenuDetails::CDocCharMenuDetails(unsigned int menuInsideId)
26: menu(menuInsideId)
27{
28        CPageParams file(PAGE_DETAILS, &menu);
29
30        this->path = file->GetPath();
31        this->rootLevel = file->GetRootLevel();
32}
33
34CDocCharMenuDetails::~CDocCharMenuDetails(void)
35{
36}
37
38void CDocCharMenuDetails::Documentation()
39{
40        CPageParams file(PAGE_DETAILS, &menu);
41
42        try
43        {
44                FileSystemUtil fsUtil(this->pInside->appConfig);
45                if(fsUtil.CreateSubDirectory(this->path)>=0)
46                {
47                        CWebPage webPage(file->GetFileName(), this->menu.GetName(), this->rootLevel, this->pInside->appConfig);
48                        CDocOverlayHelper overlayHelper(menu, rootLevel);
49
50                        const ARCharMenuStruct& menuDef = menu.GetDefinition();
51                        //ContentHead informations
52                        stringstream strmHead;
53                        strmHead.str("");
54                        int overlayType = this->menu.GetOverlayType();
55
56                        strmHead << CWebUtil::LinkToMenuIndex(this->rootLevel) << MenuSeparator << CWebUtil::ObjName(this->menu.GetName()) 
57                                << " (" << CAREnum::MenuType(menuDef.menuType) << ")" << CAREnum::GetOverlayTypeString(overlayType);
58
59                        if(!this->menu.GetAppRefName().empty())
60                                strmHead << MenuSeparator << " Application " << this->pInside->LinkToContainer(this->menu.GetAppRefName(), this->rootLevel);
61
62                        webPage.AddContentHead(strmHead.str(), overlayHelper.PlaceOverlayLink());
63                        webPage.AddContent(overlayHelper.PlaceOverlaidNotice());
64
65                        //ActiveLink Properties
66                        stringstream strmTmp;
67                        CTable tblObjProp("objProperties", "TblObjectList");
68                        tblObjProp.AddColumn(30, "Property");   
69                        tblObjProp.AddColumn(70, "Value");
70
71                        //Status
72                        CTableRow row("cssStdRow");             
73                        CTableCell cellProp("Refresh", "");                             
74                        CTableCell cellPropValue(CAREnum::MenuRefresh(this->menu.GetRefreshCode()), "");
75                        row.AddCell(cellProp);
76                        row.AddCell(cellPropValue);
77                        tblObjProp.AddRow(row); 
78
79                        //Menuspecific
80                        switch (menuDef.menuType)
81                        {               
82                        case AR_CHAR_MENU_LIST: 
83                                CharMenuDetails(tblObjProp);
84                                break;
85                        case AR_CHAR_MENU_QUERY:
86                                SearchMenuDetails(tblObjProp);
87                                break;
88                        case AR_CHAR_MENU_FILE:
89                                FileMenuDetails(tblObjProp);
90                                break;
91                        case AR_CHAR_MENU_SQL:
92                                SqlMenuDetails(tblObjProp);
93                                break;
94                        case AR_CHAR_MENU_DATA_DICTIONARY:
95                                DataDictMenuDetails(tblObjProp); 
96                                break;
97                        default:
98                                row.ClearCells();
99                                row.AddCell(MenuDefinitionText);
100                                row.AddCell(EnumDefault);
101                                tblObjProp.AddRow(row); 
102                                break;
103                        }               
104
105                        //RelatedFields
106                        row.ClearCells();
107                        cellProp.content = "Related Fields";
108                        cellPropValue.content = this->RelatedFields();
109                        row.AddCell(cellProp);
110                        row.AddCell(cellPropValue);
111                        tblObjProp.AddRow(row); 
112
113                        //RelatedActiveLinks
114                        row.ClearCells();
115                        cellProp.content = "Related ActiveLinks (Change Field)";
116                        cellPropValue.content = this->RelatedActiveLinks();
117                        row.AddCell(cellProp);
118                        row.AddCell(cellPropValue);
119                        tblObjProp.AddRow(row); 
120
121                        //used in container?
122                        row.ClearCells();
123                        cellProp.content = "Container References";
124                        cellPropValue.content = this->ContainerReferences();                           
125                        row.AddCell(cellProp);
126                        row.AddCell(cellPropValue);
127                        tblObjProp.AddRow(row);
128
129                        //Add table to page
130                        webPage.AddContent(tblObjProp.ToXHtml());
131                        tblObjProp.Clear();
132
133                        //Properties
134                        webPage.AddContent(CARProplistHelper::GetList(this->menu.GetPropList()));
135
136                        //History
137                        webPage.AddContent(this->pInside->ServerObjectHistory(&menu, this->rootLevel));
138
139                        webPage.SaveInFolder(this->path);
140                }
141        }
142        catch(exception& e)
143        {
144                cout << "EXCEPTION Menu doc of '" << this->menu.GetName() << "': " << e.what() << endl;
145        }
146}
147
148void CDocCharMenuDetails::CharMenuDetails(CTable& table)
149{
150        try
151        {
152                CTable tbl("menuItems", "TblObjectList");
153                tbl.AddColumn(20, "Type");     
154                tbl.AddColumn(40, "Label");
155                tbl.AddColumn(40, "Value");
156
157                const ARCharMenuList& menu = this->menu.GetDefinition().u.menuList;
158                for(unsigned int i=0; i< menu.numItems; i++)
159                {
160                        CTableRow row("cssStdRow");             
161                        CTableCell cellItemType(CAREnum::MenuItemType(menu.charMenuList[i].menuType), "");                             
162                        CTableCell cellItemLabel(menu.charMenuList[i].menuLabel, "");
163
164                        string mValue = "";
165                        if(menu.charMenuList[i].menuType == AR_MENU_TYPE_VALUE)
166                                mValue = menu.charMenuList[i].u.menuValue;
167                        CTableCell cellItemValue(mValue, "");
168
169                        row.AddCell(cellItemType);
170                        row.AddCell(cellItemLabel);
171                        row.AddCell(cellItemValue);
172                        tbl.AddRow(row);               
173                }
174               
175                CTableRow row;
176                row.AddCell(MenuDefinitionText);
177                row.AddCell(tbl.ToXHtml());
178                table.AddRow(row);
179        }
180        catch(exception& e)
181        {
182                cout << "EXCEPTION Menu details doc of '" << this->menu.GetName() << "': " << e.what() << endl;
183        }
184}
185
186void CDocCharMenuDetails::FileMenuDetails(CTable& table)
187{
188        try
189        {
190                stringstream strm;
191
192                const ARCharMenuFileStruct& menu = this->menu.GetDefinition().u.menuFile;
193                strm << "File Name: " << menu.filename << "<br/>";
194                strm << "Location: " << CAREnum::MenuFileLocation(menu.fileLocation) << endl;
195
196                CTableRow row;
197                row.AddCell(MenuDefinitionText);
198                row.AddCell(strm.str());
199                table.AddRow(row);
200        }
201        catch(exception& e)
202        {
203                cout << "EXCEPTION in FieldMenuDetails: " << e.what() << endl; 
204        }
205}
206
207void CDocCharMenuDetails::SqlMenuDetails(CTable& table)
208{
209
210        try
211        {
212                vector<int> attachedToSchemaList;
213                BuildUniqueSchemaList(attachedToSchemaList);
214
215                // if the menu isnt attached to any form, add a dummy to the list, so the definition is generated at least once
216                if (attachedToSchemaList.empty()) attachedToSchemaList.push_back(-1);
217
218                vector<int>::iterator curIt = attachedToSchemaList.begin();
219                vector<int>::iterator endIt = attachedToSchemaList.end();
220
221                for (; curIt != endIt; ++curIt)
222                {
223                        CARSchema schema(*curIt);
224
225                        stringstream strm;
226                        const ARCharMenuSQLStruct& menu = this->menu.GetDefinition().u.menuSQL;
227
228                        // in case a field in placed within the SQL command
229                        CRefItem refItem(this->menu, REFM_CHARMENU_SQL);
230
231                        strm << "Server: " << this->pInside->LinkToServerInfo(menu.server, rootLevel) << "<br/>" << endl;
232                        strm << "Label Index List: " << GetSQLLabelList(&menu) << "<br/>" << endl;
233                        strm << "Value Index: " << menu.valueIndex << "<br/><br/>" << endl;
234                        strm << "SQL Command: " << pInside->TextFindFields(menu.sqlCommand, "$", *curIt, rootLevel, true, &refItem) << endl;
235
236                        // add the table row now
237                        CTableRow row;
238                        row.AddCell( (schema.Exists() ? schema.GetURL(rootLevel) : MenuDefinitionText) );
239                        row.AddCell( strm.str() );
240                        table.AddRow(row);
241                }
242        }
243        catch(exception& e)
244        {
245                cout << "EXCEPTION in SqlMenuDetails: " << e.what() << endl; 
246        }
247}
248
249string CDocCharMenuDetails::GetFieldTypes(unsigned int fieldMask)
250{               
251        stringstream strm;
252        strm.str("");
253
254        try
255        {
256                unsigned int bitmask[9] = { 1, 1<<1, 1<<2, 1<<3, 1<<4, 1<<5, 1<<6, 1<<7, 1<<8 };
257                char fieldType[9][30] = { "Data", "Trim", "Control", "Page", "Page Holder", "Table", "Column", "Attachment", "Attachment Pool" };
258
259                for (unsigned int k= 0; k < 9; k++)
260                {
261                        if ( (fieldMask & bitmask[k]) != 0)
262                        {                               
263                                strm << fieldType[k] << "<br/>" << endl;                       
264                        }
265                }
266        }
267        catch(exception& e)
268        {
269                cout << "EXCEPTION in DDCharMenu GetFieldType(): " << e.what() << endl; 
270        }
271        return strm.str();
272}
273
274void CDocCharMenuDetails::DataDictMenuDetails(CTable& table)
275{
276        try
277        {
278                vector<int> attachedToSchemaList;
279                BuildUniqueSchemaList(attachedToSchemaList);
280
281                // if the menu isnt attached to any form, add a dummy to the list, so the definition is generated at least once
282                if (attachedToSchemaList.empty()) attachedToSchemaList.push_back(-1);
283
284                vector<int>::iterator curIt = attachedToSchemaList.begin();
285                vector<int>::iterator endIt = attachedToSchemaList.end();
286
287                for (; curIt != endIt; ++curIt)
288                {
289                        CARSchema schema(*curIt);
290
291                        stringstream strm;
292                        const ARCharMenuDDStruct& menu = this->menu.GetDefinition().u.menuDD;
293
294                        CRefItem refItemServer(this->menu, REFM_CHARMENU_SERVER);
295
296                        strm << "Server: " << ( menu.server[0] == '$' ? pInside->TextFindFields(menu.server, "$", *curIt, rootLevel, true, &refItemServer) : this->pInside->LinkToServerInfo(menu.server, rootLevel)) << "<br/>" << endl;
297                        strm << "Label Format: " << CAREnum::MenuDDLabelFormat(menu.nameType) << "<br/>" << endl;
298                        strm << "Value Format: " << CAREnum::MenuDDValueFormat(menu.valueFormat) << "<br/>" << endl;
299
300                        switch(menu.structType)
301                        {
302                        case AR_CHAR_MENU_DD_FORM:
303                                {
304                                        strm << "Object Type: Form<br/>" << endl;
305
306                                        string schemaType = "All";
307                                        if(menu.u.formDefn.schemaType > 0)
308                                                schemaType = CAREnum::SchemaType(menu.u.formDefn.schemaType);
309
310                                        strm << "Form Type: " << schemaType << "<br/>" << endl;
311
312                                        string showHiddenForms = "Yes";
313                                        if(!menu.u.formDefn.includeHidden)
314                                                showHiddenForms = "No";
315
316                                        strm << "Show Hidden Forms: " << showHiddenForms << "<br/>" << endl;
317                                }
318                                break;
319                        case AR_CHAR_MENU_DD_FIELD:
320                                {
321                                        CRefItem refItemForm(this->menu, REFM_CHARMENU_FORM);
322
323                                        strm << "Object Type: Field<br/>" << endl;
324                                        strm << "Form Name: " << (menu.u.fieldDefn.schema[0] == '$' ? pInside->TextFindFields(menu.u.fieldDefn.schema, "$", *curIt, rootLevel, true, &refItemForm) : CWebUtil::Validate(menu.u.fieldDefn.schema)) << "<br/><br/>" << endl;
325                                        strm << "Field Type:<br/>" << GetFieldTypes(menu.u.fieldDefn.fieldType) << "<br/>" << endl;
326                                }
327                                break;
328                        }
329
330                        // add the table row
331                        CTableRow row;
332                        row.AddCell((schema.Exists() ? schema.GetURL(rootLevel) : MenuDefinitionText));
333                        row.AddCell(strm.str());
334                        table.AddRow(row);
335                }
336        }
337        catch(exception& e)
338        {
339                cout << "EXCEPTION in DDMenuDetails: " << e.what() << endl; 
340        }
341}
342
343void CDocCharMenuDetails::SearchMenuDetails(CTable& table)
344{
345        try
346        {
347                vector<int> attachedToSchemaList;
348                BuildUniqueSchemaList(attachedToSchemaList);
349
350                // if the menu isnt attached to any form, add a dummy to the list, so the definition is generated at least once
351                if (attachedToSchemaList.empty()) attachedToSchemaList.push_back(-1);
352
353                vector<int>::iterator curIt = attachedToSchemaList.begin();
354                vector<int>::iterator endIt = attachedToSchemaList.end();
355
356                for(; curIt != endIt; ++curIt)
357                {
358                        stringstream strm;
359                        CARSchema schema(*curIt);
360
361                        const ARCharMenuQueryStruct& menu = this->menu.GetDefinition().u.menuQuery;
362                        CARSchema querySchema(menu.schema);
363
364                        strm << "Server: " << this->pInside->LinkToServerInfo(menu.server, rootLevel) << "<br/>" << endl;
365                        strm << "Schema: " << this->pInside->LinkToSchema(querySchema.GetInsideId(), menu.schema, rootLevel) << "<br/>" << endl;       
366
367                        //Label Fields
368                        for(int i=0; i< 5; i++)
369                        {
370                                if(menu.labelField[i] != 0)
371                                {
372                                        strm << "Label Field (" << i << ") : " << this->pInside->LinkToField(menu.schema, menu.labelField[i], rootLevel);
373                                        strm << " (FieldId: " << menu.labelField[i] << ")<br/>" << endl;
374
375                                        CRefItem refItem(this->menu, REFM_CHARMENU_LABELFIELD);
376                                        pInside->AddFieldReference(querySchema.GetInsideId(), menu.labelField[i], refItem);
377                                }
378                        }
379
380                        //Sort On Label
381                        string sortOnLabel = "Yes";
382                        if(!menu.sortOnLabel)
383                                sortOnLabel = "No";
384                        strm << "Sort On Label: " << sortOnLabel << "<br/>" << endl;
385
386
387                        //Value Field
388                        strm << "Value Field: " << this->pInside->LinkToField(querySchema.GetInsideId(), menu.valueField, rootLevel) << "<br/>";
389                        CRefItem refItemValue(this->menu, REFM_CHARMENU_VALUE);
390                        pInside->AddFieldReference(querySchema.GetInsideId(), menu.valueField, refItemValue);
391
392                        //Query
393                        stringstream strmQuery;
394                        strmQuery.str("");
395
396                        CRefItem refItemQuery(this->menu, REFM_CHARMENU_QUALIFICATION);
397
398                        CARQualification arQual(*this->pInside);
399                        arQual.arsStructItemType = AR_STRUCT_ITEM_XML_CHAR_MENU;
400                        arQual.CheckQuery(&menu.qualifier, refItemQuery, 0, schema.GetInsideId(), querySchema.GetInsideId(), strmQuery, rootLevel);
401
402                        if(strmQuery.str().length() > 0)
403                        {
404                                strm << "Qualification:<br/>" << strmQuery.str() << endl;
405                        }
406                        else
407                        {
408                                strm << "Qualification: " << EmptyValue << "<br/>" << endl;
409                        }
410
411                        // now add the row to the table
412                        CTableRow row;
413                        row.AddCell((schema.Exists() ? schema.GetURL(rootLevel) : MenuDefinitionText));
414                        row.AddCell(strm.str());
415                        table.AddRow(row);
416                }
417        }
418        catch(exception& e)
419        {
420                cout << "EXCEPTION in SearchMenuDetails: " << e.what() << endl; 
421        }
422}
423
424string CDocCharMenuDetails::RelatedFields()
425{       
426        CTable tbl("relatedFields", "TblObjectList");
427        tbl.AddColumn(40, "Field Name");       
428        tbl.AddColumn(20, "Field Id");
429        tbl.AddColumn(40, "Form");
430
431        try
432        {
433                const CARCharMenu::ReferenceList& refs = this->menu.GetReferences();
434                CARCharMenu::ReferenceList::const_iterator curIt = refs.begin();
435                CARCharMenu::ReferenceList::const_iterator endIt = refs.end();
436
437                for (; curIt != endIt; ++curIt)
438                {
439                        if (curIt->GetObjectType() == AR_STRUCT_ITEM_XML_FIELD && curIt->GetMessageId() == REFM_FIELD_CHARMENU)
440                        {
441                                CARField field(curIt->GetObjectId(), curIt->GetSubObjectId());
442                               
443                                CTableRow row("cssStdRow");             
444                                row.AddCell(field.GetURL(rootLevel));
445                                row.AddCell(CTableCell(field.GetInsideId()));
446                                row.AddCell(field.GetSchema().GetURL(rootLevel));
447                                tbl.AddRow(row);               
448                        }
449                }
450        }
451        catch(exception& e)
452        {
453                cout << "EXCEPTION in CharMenu related fields: " << e.what() << endl; 
454        }
455
456        return tbl.ToXHtml();
457}
458
459string CDocCharMenuDetails::RelatedActiveLinks()
460{
461        CTable tbl("relatedActiveLinks", "TblObjectList");
462        tbl.AddColumn(100, "Active Link");
463
464        try
465        {
466                const CARCharMenu::ReferenceList& refs = this->menu.GetReferences();
467                CARCharMenu::ReferenceList::const_iterator curIt = refs.begin();
468                CARCharMenu::ReferenceList::const_iterator endIt = refs.end();
469
470                for (; curIt != endIt; ++curIt)
471                {
472                        if (curIt->GetObjectType() == AR_STRUCT_ITEM_XML_ACTIVE_LINK)
473                        {
474                                CARActiveLink al(curIt->GetObjectId());
475
476                                CTableRow row("cssStdRow");
477
478                                stringstream tmp;
479                                tmp << curIt->IfElse() << "-Action " << curIt->ActionIndex() << " " << al.GetURL(rootLevel);
480
481                                CTableCell cellActiveLink(tmp.str(), "");                                               
482                                row.AddCell(cellActiveLink);
483                                tbl.AddRow(row);       
484                        }
485                }
486        }
487        catch(exception& e)
488        {
489                cout << "EXCEPTION in CharMenu related active links: " << e.what() << endl; 
490        }
491
492        return tbl.ToXHtml();
493}
494
495string CDocCharMenuDetails::ContainerReferences()
496{
497        stringstream strm;
498        strm.str("");
499        try
500        {
501                CContainerTable contTable(*this->pInside);
502                unsigned int cntCount = this->pInside->containerList.GetCount();
503                for ( unsigned int cntIndex = 0; cntIndex < cntCount; ++cntIndex )
504                {
505                        CARContainer cont(cntIndex);
506
507                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(cont))
508                                continue;
509
510                        if(cont.GetType() != ARCON_APP)
511                        {
512                                const ARReferenceList& refs = cont.GetContent();
513                                for(unsigned int nCnt = 0; nCnt < refs.numItems; nCnt++)
514                                {
515                                        if(refs.referenceList[nCnt].type == ARREF_CHAR_MENU)
516                                        {
517                                                if(refs.referenceList[nCnt].reference.u.name[0] != 0 &&
518                                                   strcmp(this->menu.GetARName(), refs.referenceList[nCnt].reference.u.name) == 0)
519                                                {
520                                                        contTable.AddRow(cont, rootLevel);
521                                                }
522                                        }
523                                }
524                        }
525                }
526
527                strm << contTable;
528        }
529        catch(exception& e)
530        {
531                cout << "EXCEPTION enumerating char menu container references of '" << this->menu.GetARName() << "': " << e.what() << endl;
532        }
533
534        return strm.str();
535}
536
537string CDocCharMenuDetails::GetSQLLabelList(const ARCharMenuSQLStruct *sqlMenu)
538{
539        stringstream strm;
540        char buffer[16];
541
542        if (sqlMenu == NULL) return "";
543
544        for (int k=0; k<5; ++k)
545        {
546                if (sqlMenu->labelIndex[k] == 0) break;
547               
548                if (k > 0) strm << ",";
549                sprintf(buffer, "%d", sqlMenu->labelIndex[k]);
550                //_itoa(sqlMenu->labelIndex[k], buffer, 16);
551                strm << buffer;
552        }
553
554        return strm.str();
555}
556
557void CDocCharMenuDetails::BuildUniqueSchemaList(std::vector<int>& schemaList)
558{
559        const CARCharMenu::ReferenceList& refs = this->menu.GetReferences();
560        CARCharMenu::ReferenceList::const_iterator curIt = refs.begin();
561        CARCharMenu::ReferenceList::const_iterator endIt = refs.end();
562
563        for (; curIt != endIt; ++curIt)
564        {
565                switch (curIt->GetObjectType())
566                {
567                case AR_STRUCT_ITEM_XML_FIELD:
568                        {
569                                // the objectId of a field reference contains the schema id ... add it
570                                schemaList.push_back(curIt->GetObjectId());
571                        }
572                        break;
573                case AR_STRUCT_ITEM_XML_ACTIVE_LINK:
574                        {
575                                CARActiveLink al(curIt->GetObjectId());
576                                const ARWorkflowConnectStruct& conStruct = al.GetSchemaList();
577                                if (conStruct.type == AR_WORKFLOW_CONN_SCHEMA_LIST)
578                                {
579                                        int conCount = conStruct.u.schemaList->numItems;
580                                        for (int conIdx = 0; conIdx < conCount; ++conIdx)
581                                        {
582                                                CARSchema schema(conStruct.u.schemaList->nameList[conIdx]);
583                                               
584                                                if (schema.Exists())
585                                                {
586                                                        // each schema the referenced active link is attached to, is a candidate... add it
587                                                        schemaList.push_back(schema.GetInsideId());
588                                                }
589                                        }
590                                }
591                        }
592                        break;
593                }
594        }
595
596        SortAndRemoveDuplicates(schemaList);
597}
Note: See TracBrowser for help on using the repository browser.