TabBars代码解读之——代码注释与恢复功能

Google

    代码注释就是讲文档窗口中选择的文本编程C/C++语言的注释块,TabBars插件设置这个功能主要是为了简化编程过程中的操作。通常用C风格注释一段代码需要在代码的开始添加/*,并在代码的结束添加*/,用C++风格则是在每行的行首添加//,如果要恢复这些代码就需要再删除这些符号。TabBars插件提供了自动添加和去处这些注释符号的功能,还支持在代码开始处插入时间戳等信息。

  添加注释符号有两种风格:C风格和C++风格。TabBars虽然提供了两种风格的注释符号添加方式,但是在某些情况下的处理方式是一样的,比如,当TabBars判断出选择的文本是一行代码中的一段时,通常只使用/**/方式,因为多数情况下用户这样选择是为了注释函数参数或替换表示符,使用/**/更符合用户的意图。
   
    添加注释符号需要首先从文档中得到当前选择的文本块,使用ITextDocument的get_Selection可以得到一个ITextSelection对象,通过ITextSelection对象的四个属性:TopLine,BottomLine,CurrentLine和CurrentColumn可以得到N当前选择的文本的四个位置坐标,这些坐标以行和字符为单位,这几个坐标就是TabBars判断用户是选择了一行代码还是一段代码的依据。以下代码就是对用户选择进行判断并对文本块添加C风格的注释符号的过程:

strText = bstr;
long lStart = 0,lEnd = 0,iColEnd = 0,lCurrent;
pSel->get_TopLine(&lStart);
pSel->get_BottomLine(&lEnd);
pSel->get_CurrentLine(&lCurrent);
pSel->get_CurrentColumn(&iColEnd);
if(lStart == lEnd) //选择在一行上
{
 if((lCurrent == lEnd) && (iColEnd > 1))//不是一整行
 {
  strTmp.Format(_T("/*%s*/"),strText);//依然使用/**/
  bstr = strTmp;
  pSel->put_Text(bstr);
 }
 else if((lCurrent == (lEnd + 1)) && (iColEnd == 1))//是一整行
 {
  strTmp.Format(_T("//%s"),strText);//使用//
  bstr = strTmp;
  pSel->put_Text(bstr);
 }
}
else//选择了多行
{
 int idx = 0;
 int totalline = lEnd - lStart + 1;
 
 strTmp = _T("/*"); //注释开始符号
 if(g_bAddTime && g_bAddUser) //判断是否添加附加注释信息
 {
  CString strtt;
  strTmp += _T("@**#---");//附加信息开始标志
  if(g_bAddTime)
  {
   SYSTEMTIME st;
   ::GetLocalTime(&st);
   strtt.Format(_T("%04d-%02d-%02d %02d:%02d:%02d "),st.wYear,st.wMonth,
    st.wDay,st.wHour,st.wMinute,st.wSecond);
   strTmp += strtt;
  }
  if(g_bAddUser)
  {
   strtt.Format(_T("(%s)"),g_szUser);
   strTmp += strtt;
  }
  strTmp += _T("
---#**@");//附加信息结束标志
 }
 strTmp += _T("\r\n");
 strTmp += strText;
 strTmp += _T("*/");//注释结束符号

 bstr = strTmp;
 pSel->put_Text(bstr);//替换选择的文本
}

添加C++风格的注释处理单行文本时和上面的过程一样,但是在处理多行文本时稍有不同,具体就是在每行的行首插入//符号。

    恢复代码的过程就是讲注释符号从选择的文本中删除的过程,TabBars插件可以自动识别注释的风格并自动删除注释符号。对于使用/**/注释的文本,选择取消注释时并不一定要严格地选择从/*开始到*/结束的文本,多一点少一点没关系,TabBars插件会自动匹配注释符号。至于使用C++风格的块注释,TabBars会删除每一行的第一个//匹配,不影响其他的行内注释:

strTmp = lpszNull;
int idx = 0;
while((idx = strText.Find(_T("//"),idx)) != -1)
{
 bChange = TRUE;
 strTmp += strText.Left(idx);
 strText = strText.Mid(idx + 2); //过滤 //
 idx = strText.Find(_T("\r\n"),0);//跳到行尾
 strTmp += strText.Left(idx + 2);//
 strText = strText.Mid(idx + 2);//从新行开始找
 idx = 0;
}
strTmp += strText;//It is not a good idea, but can void many bugs

posted @ 2005-09-27 19:59  oRbIt  阅读(481)  评论(0)    收藏  举报