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

📄 main.cpp

📁 一个用C++Builder写的XML编辑器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <IniFiles.hpp>

#include "main.h"
#include "XMLAbout.h"
#include <shellapi.h>
#include <dir.h>

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SHDocVw_OCX"
#pragma resource "*.dfm"
TFormXMLEdit *FormXMLEdit;
//---------------------------------------------------------------------------
__fastcall TFormXMLEdit::TFormXMLEdit(TComponent* Owner)
        : TForm(Owner)
{
  EnableAll();

  EditType = etNull ;

  BufferXMLNode  = NULL;
  BufferTreeNode = NULL;

  RenKeyFlag     = false;
  SaveValueListEditor = new TValueListEditor(this);

  XMLDocumentToEdit->Options << doAutoSave ;

  DateSeparator = '-';
  ShortTimeFormat = "hh:mm:ss";
  ShortDateFormat = "yyyy-mm-dd";

  //初始化状态栏
  int lTime = (StrLen("时间:2001-07-25 17:35:00")+1)* StatusBarMain->Font->Size;
  StatusBarMain->Width = Width;
  StatusBarMain->Panels->Items[0]->Width = Width - lTime ;
  StatusBarMain->Panels->Items[1]->Width = lTime;


}
//---------------------------------------------------------------------------
void __fastcall TFormXMLEdit::AddNode(TTreeNode *TreeNode,IXMLNode *XMLNode)
{
 try
 {

  AnsiString  NodeName = XMLNode->GetNodeName();
  TTreeNode *tNode = TreeViewXML->Items->AddChildObject(TreeNode, NodeName,XMLNode);
  IXMLNodeList *ChildList = XMLNode->ChildNodes;
  for(int i = 0;i < ChildList->Count;i++)
  {
   AddNode(tNode ,ChildList->Nodes[i]);
   }
 }
 catch( Exception &e)
 {
   Application->MessageBox(e.Message.c_str(), "警告", MB_OK);
   return;
 }

}
//---------------------------------------------------------------------------
void __fastcall TFormXMLEdit::AddXMLNode(IXMLNode *XMLNodeDest,IXMLNode *XMLNodeSour )
{
 try
 {

  IXMLNodeList *XMLNodeChildList = XMLNodeSour->ChildNodes;
  AnsiString  tNodeName ;
  IXMLNode   *tXMLNode, *NewNode;


  //IXMLNodeList->Node[0]->NodeName is ' #Text', 所以只从第二个开始,即Index为1
  for(int i = 0; i < XMLNodeChildList->Count; i++)
  {
   tXMLNode = XMLNodeChildList->Nodes[i];
   tNodeName = tXMLNode->NodeName;
   //bool isNUll = tNodeName.IsEmpty() ;

   NewNode  = XMLNodeDest->AddChild(tNodeName);

   AddXMLNode(NewNode ,tXMLNode);
  }

  IXMLNodeList *child_Attri_list = XMLNodeSour->AttributeNodes ;
  IXMLNode *ANode;

  int tCount =  child_Attri_list->Count;
  AnsiString sNodeName,sNodeValue;
  OleVariant OLEValue;

  for(int i = 0;i < tCount  ; i++)
  {
    ANode = child_Attri_list->Nodes[i];
    sNodeName  =  ANode->NodeName ;
    OLEValue   =  ANode->NodeValue ;
    if(OLEValue.IsNull())
       sNodeValue = "";
    else
       sNodeValue = AnsiString(OLEValue);

    XMLNodeDest->SetAttribute(sNodeName,sNodeValue);
  }


 }
 catch( Exception &e)
 {
   Application->MessageBox(e.Message.c_str(), "警告", MB_OK);
   return;
 }

}
//---------------------------------------------------------------------------
void __fastcall TFormXMLEdit::TreeViewXMLChange(TObject *Sender, TTreeNode *Node)

{

 ValueListEditorValue->Strings->Clear();
 IXMLNode *cnode =  (IXMLNode * )TreeViewXML->Selected->Data ;
 IXMLNode *ANode;

 if ( !cnode )
 {
   SelectedXMLNode = NULL ;
   return ;
 }

 if ( cnode->NodeName.IsEmpty() )
 {
   SelectedXMLNode = NULL ;
   return ;
 }

 SelectedXMLNode = cnode ;

 IXMLNodeList *child_Attri_list = cnode->AttributeNodes ;
 int tCount =  child_Attri_list->Count;

 if ( tCount < 1 )
   ValueListEditorValue->Enabled = false ;
 else
   ValueListEditorValue->Enabled =  true ;


 AnsiString s1,s2;
 OleVariant oVa;
 try
 {

  for(int i = 0;i < tCount  ; i++)
  {
    ANode = child_Attri_list->Nodes[i];
    s1  = ANode->NodeName ;
    oVa =  ANode->NodeValue ;
    if(oVa.IsNull())
       s2 = "";
    else
       s2 = AnsiString(oVa);

    ValueListEditorValue->Strings->Add(s1 + " = " +  s2);
  }
 }
 catch( Exception &e)
 {
     Application->MessageBox(e.Message.c_str(), "警告", MB_OK);
     return;
 }

}
//---------------------------------------------------------------------------
void __fastcall TFormXMLEdit::ToolButtonOpenClick(TObject *Sender)
{
  if( OpenDialogFile->Execute() )
  {
    OpenXMLFromFile(OpenDialogFile->FileName) ;
  }
}
//---------------------------------------------------------------------------
int   __fastcall TFormXMLEdit::OpenXMLFromFile(AnsiString FileName )
{
   XMLFileName = FileName ;

   XMLDocumentToEdit->Active = false;
   XMLDocumentToEdit->LoadFromFile(FileName );
   //CppWebBrowser1->LocationName = OpenDialog1->FileName ;
   TreeViewXML->Items->Clear() ;
   //AnsiString s1 =  XMLDocumentToEdit->DocumentElement->GetNodeName();
   //IXMLNodeList *child_list = XMLDocumentToEdit->DocumentElement->ChildNodes;
   //IXMLNode *cnode = XMLDocumentToEdit->DocumentElement;
   //IXMLNode *cnode1 ;
   AddNode(NULL,XMLDocumentToEdit->DocumentElement);


   XMLDocumentToEdit->Active = true ;
   RootXMLNode = XMLDocumentToEdit->DocumentElement;

   EnableAll( true );

   //设置最近打开的文件菜单
   SaveRecent();
   LoadRecent();


   return 1;
   
}
//---------------------------------------------------------------------------
void __fastcall TFormXMLEdit::ToolButtonSaveClick(TObject *Sender)
{
 // To Do
 XMLDocumentToEdit->SaveToFile(XMLFileName);
}
//---------------------------------------------------------------------------

void __fastcall TFormXMLEdit::MenuFileCloseClick(TObject *Sender)
{
  if ( !XMLDocumentToEdit->IsEmptyDoc())
    XMLDocumentToEdit->SaveToFile(XMLFileName);
  Close();
}
//---------------------------------------------------------------------------


void __fastcall TFormXMLEdit::TreeViewXMLMouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  // To Do
 try{

  switch ( Button )
  {
   case mbLeft:
         break;

   case mbRight:
         if ( TreeViewXML->Items->Count > 0 )
         {
           PopupMenuXML->Popup( X,Y );
         }
         break;
  }
  }catch(Exception &e)
  {
     Application->MessageBox(e.Message.c_str(), "警告", MB_OK);
     return;
  }

}
//---------------------------------------------------------------------------

void __fastcall TFormXMLEdit::PopupMenuInsElementClick(TObject *Sender)
{
 //To Do
 if ( !TreeViewXML->Selected )
   return ;

 IXMLNode *SelectedNode =  (IXMLNode * )TreeViewXML->Selected->Data ;

 randomize();
 AnsiString NewName = "新结点"  + IntToStr( random (1000) );

 AnsiString InputString = InputBox("插入新结点", "新结点的名字:", NewName);

 IXMLNode *NewNode = SelectedNode->AddChild(WideString(InputString),"");

 AddNode( TreeViewXML->Selected, NewNode );

}
//---------------------------------------------------------------------------

void __fastcall TFormXMLEdit::PopupMenuInsAttribClick(TObject *Sender)
{
  //To Do
 if ( !TreeViewXML->Selected )
   return ;


 IXMLNode *SelectedNode =  (IXMLNode * )TreeViewXML->Selected->Data ;

 randomize();
 AnsiString NewName = "新属性"  + IntToStr( random (1000) );

 AnsiString InputString = InputBox("插入新属性", "新属性的名字:", NewName);

 randomize();
 AnsiString NewValue = "NewValue"  + IntToStr( random (65535) );

 SelectedNode->SetAttribute(WideString(InputString),WideString(NewValue));

 BrushAttribute( SelectedNode );

}
//---------------------------------------------------------------------------
void __fastcall TFormXMLEdit::PopupMenuDelClick(TObject *Sender)
{
  //To Do
 if ( !TreeViewXML->Selected )
   return ;

 IXMLNode  *SelectedNode =  (IXMLNode * )TreeViewXML->Selected->Data ;

 int ToDel = Application->MessageBox(AnsiString("要删除"" + SelectedNode->NodeName + ""结点吗?").c_str(), "警告", MB_YESNO	);
 if ( ToDel != IDYES )
   return ;
 try
 {
  TTreeNode *SelectedTreeNode = TreeViewXML->Selected;

  IXMLNode  *ParentNode  =  SelectedNode->ParentNode;
  IXMLNodeList *ChildNodeList = ParentNode->ChildNodes ;

  int iRet = ChildNodeList->Delete(SelectedNode->NodeName);
  if ( iRet < 0 )
   return ;

  SelectedTreeNode->DeleteChildren();
  TreeViewXML->Items->Delete(SelectedTreeNode) ;

  ValueListEditorValue->Strings->Clear();
  }
  catch(Exception &e)
  {
    Application->MessageBox( AnsiString("删除"" + SelectedNode->NodeName + ""结点错误,错误信息:" + e.Message).c_str(), "错误", MB_OK);
    return;
  }



}
//---------------------------------------------------------------------------
void __fastcall TFormXMLEdit::BrushAttribute(IXMLNode *aNode)

{
 if ( !aNode )
   return ;

 ValueListEditorValue->Strings->Clear();

 IXMLNodeList *child_Attri_list = aNode->AttributeNodes ;
 int tCount =  child_Attri_list->Count;
 AnsiString s1,s2;
 OleVariant oVa;
 try
 {

  for(int i = 0;i < tCount ; i++)
  {
    aNode = child_Attri_list->Nodes[i];
    s1  = aNode->NodeName ;
    oVa = aNode->NodeValue ;
    if(oVa.IsNull())
       s2 = "";
    else
       s2 = AnsiString(oVa);

    ValueListEditorValue->Strings->Add(s1 + " = " +  s2);
  }
 }
 catch( Exception &e)
 {
     Application->MessageBox(e.Message.c_str(), "警告", MB_OK);
     return;
 }

}
//---------------------------------------------------------------------------

void __fastcall TFormXMLEdit::ToolButtonInsClick(TObject *Sender)
{
 //弹出popup菜单
 PopupMenuIns->Popup( this->Left + 256,this->Top + 72 );

}
//---------------------------------------------------------------------------

void __fastcall TFormXMLEdit::MenuHelpAboutClick(TObject *Sender)
{
  if ( !OKBottomDlgAbout )
     OKBottomDlgAbout = new TOKBottomDlgAbout(this);
  OKBottomDlgAbout->ShowModal();
}
//---------------------------------------------------------------------------
void  __fastcall TFormXMLEdit::EnableAll(bool State)
{
   MenuFileSave->Enabled         = State ;
   MenuFileSaveAs->Enabled       = State ;
   MenuFileRecent->Enabled       = true ;
   MenuFileCloseFile->Enabled    = State ;
   MenuFileClose->Enabled        = true ;

   MenuEditCut->Enabled          = State ;
   MenuEditCopy->Enabled         = State ;
   MenuEditPaste->Enabled        = State ;
   MenuEditClear->Enabled        = State ;
   MenuEditRenNode->Enabled      = State ;
   MenuEditRenAttrib->Enabled    = State ;
   MenuEditFind->Enabled         = false ;

   MenuViewSource->Enabled       = State ;
   MenuViewPreview->Enabled      = State ;
   MenuViewExpand->Enabled       = State ;
   MenuViewCollapse->Enabled     = State ;

   MenuInsElement->Enabled       = State ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -