📄 xmlsample.c
字号:
/*****************************************************************************/
/* Sample program to illustrate CVIXML toolbox instrument */
/*****************************************************************************/
/*****************************************************************************/
/* Include files */
/*****************************************************************************/
#include "pathctrl.h"
#include <cvirte.h>
#include <userint.h>
#include "XMLSample.h"
#include "CVIXML.h"
/*****************************************************************************/
/* Macros and constants */
/*****************************************************************************/
#define hrChk(f) if (error = (f), FAILED (error)) goto Error; else
#define ERR_MSG_SIZE 512
#define TEXT_SIZE 512
#define UIR_FILE_NAME "XMLSample.uir"
#define XML_FILE_EXTN "*.xml"
#define ERR_MSG_TITLE "Error Message"
#define NEW_ELEM_PROMPT_TITLE "New Element"
#define NEW_ELEM_PROMPT_MSG "Enter a tag name for the new element: "
#define INVALID_TAG_NAME_MSG "Invalid tag name."
#define INVALID_ATTR_NAME_MSG "Invalid attribute name."
#define XML_FILE_DLG_TITLE "Select XML File"
#define EMPTY_STRING ""
#define HELP_DLG_TITLE "Help Information"
#define HELP_MAIN_MSG "\
This is a sample program to illustrate the CVIXML toolbox instrument.\n\
This program allows you to view and edit XML elements. The current XML\n\
element's information is displayed in this dialog. You can view the\n\
element's attributes by clicking the 'View Element Attributes...' button.\n\
Using the 'View Parent Element...' button you can navigate to the parent\n\
of the current element. The children of the current element are displayed\n\
in the list box. You can navigate to the different elements by selecting\n\
them in the list box or using the buttons. You can also insert and delete\n\
elements using appropriate buttons in this panel. You can save your changes\n\
to the XML file by clicking the 'Save XML' button."
#define HELP_ATTR_MSG "\
This dialog displays the current XML element's attributes. You can edit,\n\
add or delete attributes in this dialog. You will be taken back to the\n\
main dialog when you dismiss this dialog."
/*****************************************************************************/
/* Global variables */
/*****************************************************************************/
static int panelHandle = 0;
static int attrPanelHandle = 0;
static CVIXMLElement curElem;
static CVIXMLDocument doc;
/*****************************************************************************/
/* Forward declarations */
/*****************************************************************************/
static void UpdateUI (void);
static void UpdateUIDimming (int hasXML);
static void UpdateElement (void);
static void UpdateChildren (void);
static void UpdateAttributes (void);
static int IsValidXML (char * string);
static void DisplayActiveXErrorMessageOnFailure (HRESULT error);
/*****************************************************************************/
/* Functions */
/*****************************************************************************/
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1;
if ((panelHandle = LoadPanel (0, UIR_FILE_NAME, PANEL)) < 0)
goto Error;
if ((attrPanelHandle = LoadPanel (0, UIR_FILE_NAME, ATTRPANEL)) < 0)
goto Error;
NewPathCtrl (panelHandle, PANEL_FILE, 8, 0);
UpdateUIDimming (0);
DisplayPanel (panelHandle);
RunUserInterface ();
Error:
if (attrPanelHandle)
DiscardPanel (attrPanelHandle);
if (panelHandle)
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK PanelCb (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event)
{
case EVENT_KEYPRESS:
if (panel == attrPanelHandle)
if (eventData1 == VAL_ESC_VKEY || eventData1 == VAL_ENTER_VKEY)
AttrOK (panel, ATTRPANEL_ATTR_OK, EVENT_COMMIT, 0, 0, 0);
if (panel == panelHandle && eventData1 == VAL_ESC_VKEY)
Quit (panel, PANEL_QUIT, EVENT_COMMIT, 0, 0, 0);
break;
}
return 0;
}
int CVICALLBACK FileCb (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char path[MAX_PATHNAME_LEN];
HRESULT error = S_OK;
switch (event)
{
case EVENT_COMMIT:
CVIXMLDiscardElement (curElem);
CVIXMLDiscardDocument (doc);
curElem = 0;
doc = 0;
UpdateUIDimming (0);
GetCtrlVal (panel, PANEL_FILE, path);
hrChk (CVIXMLLoadDocument (path, &doc));
hrChk (CVIXMLGetRootElement (doc, &curElem));
UpdateUIDimming (1);
UpdateUI ();
break;
}
Error:
DisplayActiveXErrorMessageOnFailure (error);
return 0;
}
int CVICALLBACK BrowseCb (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char path[MAX_PATHNAME_LEN];
switch (event)
{
case EVENT_COMMIT:
if (VAL_EXISTING_FILE_SELECTED == FileSelectPopup (EMPTY_STRING, XML_FILE_EXTN,
XML_FILE_EXTN, XML_FILE_DLG_TITLE, VAL_SELECT_BUTTON, 0, 0, 1, 0, path))
{
SetCtrlVal (panel, PANEL_FILE, path);
FileCb (panel, PANEL_FILE, EVENT_COMMIT, 0, 0, 0);
}
break;
}
return 0;
}
int CVICALLBACK Help (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
MessagePopup (HELP_DLG_TITLE,
panel == attrPanelHandle ? HELP_ATTR_MSG : HELP_MAIN_MSG);
break;
}
return 0;
}
int CVICALLBACK ChildInsertBefore (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int index = 0;
char tag[TEXT_SIZE];
CVIXMLElement tempElem = 0;
HRESULT error = S_OK;
switch (event)
{
case EVENT_COMMIT:
PromptPopup (NEW_ELEM_PROMPT_TITLE, NEW_ELEM_PROMPT_MSG,
tag, TEXT_SIZE-1);
if (!IsValidXML (tag))
{
MessagePopup (ERR_MSG_TITLE, INVALID_TAG_NAME_MSG);
goto Error;
}
GetCtrlIndex (panelHandle, PANEL_CHILD_LIST, &index);
if (index == -1)
index = 0;
hrChk (CVIXMLNewElement (curElem, index, tag, &tempElem));
InsertListItem (panelHandle, PANEL_CHILD_LIST, index, tag, tempElem);
SetCtrlIndex (panelHandle, PANEL_CHILD_LIST, index);
UpdateUI ();
break;
}
Error:
DisplayActiveXErrorMessageOnFailure (error);
return 0;
}
int CVICALLBACK ChildInsertAfter (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int index = 0;
char tag[TEXT_SIZE];
CVIXMLElement tempElem = 0;
HRESULT error = S_OK;
switch (event)
{
case EVENT_COMMIT:
PromptPopup (NEW_ELEM_PROMPT_TITLE, NEW_ELEM_PROMPT_MSG,
tag, TEXT_SIZE-1);
if (!IsValidXML (tag))
{
MessagePopup (ERR_MSG_TITLE, INVALID_TAG_NAME_MSG);
goto Error;
}
GetCtrlIndex (panelHandle, PANEL_CHILD_LIST, &index);
hrChk (CVIXMLNewElement (curElem, index + 1, tag, &tempElem));
InsertListItem (panelHandle, PANEL_CHILD_LIST, index + 1, tag, tempElem);
SetCtrlIndex (panelHandle, PANEL_CHILD_LIST, index + 1);
UpdateUI ();
break;
}
Error:
DisplayActiveXErrorMessageOnFailure (error);
return 0;
}
int CVICALLBACK ElemGoToParent (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int index = 0;
CVIXMLElement parElem = 0;
HRESULT error = S_OK;
switch (event)
{
case EVENT_COMMIT:
if (curElem)
{
hrChk (CVIXMLGetParentElement (curElem, &parElem));
if (parElem)
{
CVIXMLDiscardElement (curElem);
curElem = parElem;
parElem = 0;
UpdateUI ();
GetCtrlIndex (panelHandle, PANEL_CHILD_LIST, &index);
if (index != -1)
SetCtrlIndex (panelHandle, PANEL_CHILD_LIST, 0);
}
}
break;
}
Error:
CVIXMLDiscardElement (parElem);
DisplayActiveXErrorMessageOnFailure (error);
return 0;
}
int CVICALLBACK SaveDocument (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
HRESULT error = S_OK;
switch (event)
{
case EVENT_COMMIT:
if (doc)
hrChk (CVIXMLSaveDocument (doc, 0, NULL));
break;
}
Error:
DisplayActiveXErrorMessageOnFailure (error);
return 0;
}
int CVICALLBACK Quit (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
CVIXMLDiscardElement (curElem);
CVIXMLDiscardDocument (doc);
QuitUserInterface (0);
break;
}
return 0;
}
int CVICALLBACK AttrAdd (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int length = 0;
Point tempPt;
switch (event)
{
case EVENT_COMMIT:
GetNumTableRows (attrPanelHandle, ATTRPANEL_ATTR_LIST, &length);
tempPt = MakePoint (1, length + 1);
InsertTableRows (attrPanelHandle, ATTRPANEL_ATTR_LIST, length + 1,
1, VAL_CELL_STRING);
SetActiveCtrl (attrPanelHandle, ATTRPANEL_ATTR_LIST);
SetActiveTableCell (attrPanelHandle, ATTRPANEL_ATTR_LIST, tempPt);
SetCtrlAttribute (attrPanelHandle, ATTRPANEL_ATTR_DELETE,
ATTR_DIMMED, 0);
break;
}
return 0;
}
int CVICALLBACK AttrDelete (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int i = 0;
char value[TEXT_SIZE];
Rect activeCells;
Point activePt;
Point tempPt;
CVIXMLAttribute newAttr = 0;
HRESULT error = S_OK;
switch (event)
{
case EVENT_COMMIT:
if (curElem)
{
GetActiveTableCell (attrPanelHandle, ATTRPANEL_ATTR_LIST, &activePt);
GetTableSelection (attrPanelHandle, ATTRPANEL_ATTR_LIST, &activeCells);
if (activePt.y)
{
if (!activeCells.top)
activeCells.top = activePt.y;
for (i = activeCells.top;
i <= activeCells.top + activeCells.height - 1; i++)
{
tempPt = MakePoint (1, i);
GetTableCellVal (attrPanelHandle, ATTRPANEL_ATTR_LIST,
tempPt, value);
if (value[0] == '\0')
{
DeleteTableRows (attrPanelHandle, ATTRPANEL_ATTR_LIST,
i, 1);
}
else
{
hrChk (CVIXMLGetAttributeByName (curElem, value,
&newAttr));
if (newAttr)
hrChk (CVIXMLRemoveAttribute (newAttr));
}
}
UpdateAttributes ();
}
}
break;
}
Error:
CVIXMLDiscardAttribute (newAttr);
DisplayActiveXErrorMessageOnFailure (error);
return 0;
}
int CVICALLBACK ChildDelete (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int index = 0;
int numItems = 0;
CVIXMLElement newElem = 0;
HRESULT error = S_OK;
switch (event)
{
case EVENT_COMMIT:
if(curElem)
{
GetCtrlIndex (panelHandle, PANEL_CHILD_LIST, &index);
if (index != -1)
{
GetValueFromIndex (panelHandle, PANEL_CHILD_LIST,
index, &newElem);
hrChk (CVIXMLRemoveElement (newElem));
UpdateUI ();
GetNumListItems (panelHandle, PANEL_CHILD_LIST, &numItems);
if (index == numItems)
index--;
if (numItems)
SetCtrlIndex (panelHandle, PANEL_CHILD_LIST, index);
}
}
break;
}
Error:
CVIXMLDiscardElement (newElem);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -