⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlsample.c

📁 labwindow 编程的toolbox例程。
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************/
/* 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 + -