Author Topic: about bracecompletion  (Read 15929 times)

Offline blueshake

  • Regular
  • ***
  • Posts: 459
about bracecompletion
« on: August 17, 2009, 05:28:44 am »
hello, jens:
refer to visual assist,I do a fes modifications for bracecompletion.
two modificactions:
1. the { } will stay in the same line now if current line have other words.
2. if the current caret postion's next char is not empty,the bracecompletion will not work.
here is the patch.
Code
Index: cbeditor.cpp
===================================================================
--- cbeditor.cpp (revision 5731)
+++ cbeditor.cpp (working copy)
@@ -331,19 +331,26 @@
         }
         if ( IsCharacterOrString(style) )
             return;
-        wxString leftBrace(_T("([{"));
-        wxString rightBrace(_T(")]}"));
+        const wxString leftBrace(_T("([{"));
+        const wxString rightBrace(_T(")]}"));
         int index = leftBrace.find(ch);
-        if (index != wxNOT_FOUND)
+        //Manager::Get()->GetLogManager()->DebugLog(F(_T("current: %d"),control->GetCharAt(pos)));
+        //Manager::Get()->GetLogManager()->DebugLog(_T("current:")+control->GetCharAt(pos));
+        const wxString unWant(_T("\n\r\t\b "));
+        if (index != wxNOT_FOUND && unWant.find(control->GetCharAt(pos)) != wxNOT_FOUND)
         {
-            control->AddText(rightBrace.GetChar(index));
-            control->GotoPos(pos);
-            if (ch == _T('{'))
-            {
-                control->NewLine();
+                control->AddText(rightBrace.GetChar(index));
                 control->GotoPos(pos);
-                return;
-            }
+                if (ch == _T('{'))
+                {
+                    const wxRegEx reg(_T("^[ \t]*{}[ \t]*"));
+                    if (reg.Matches(control->GetCurLine()))
+                    {
+                        control->NewLine();
+                        control->GotoPos(pos);
+                        return;
+                    }
+                }
         }
         else
         {
Keep low and hear the sadness of little dog.
I fall in love with a girl,but I don't dare to tell her.What should I do?

Offline killerbot

  • Administrator
  • Lives here!
  • *****
  • Posts: 5491
Re: about bracecompletion
« Reply #1 on: August 17, 2009, 09:05:51 am »
could you give some examples of the improvements [before/after] ?

mariocup

  • Guest
Re: about bracecompletion
« Reply #2 on: August 17, 2009, 09:13:51 am »
Hi blueshake,

2. if the current caret postion's next char is not empty,the bracecompletion will not work.
here is the patch.

I agree that the bracecompletion should not work if the next char is not empty. For example if you have a statement like

Code
if (variable1 && variable2)

and now modify the condition

Code
if (variable1 && (

then I do not want to add instantly the closing bracket, since this is not the desired place.

Offline killerbot

  • Administrator
  • Lives here!
  • *****
  • Posts: 5491
Re: about bracecompletion
« Reply #3 on: August 17, 2009, 09:18:44 am »
but what if you have the following
Code
if(test1)

and you want to add something like

Code
&& (test2 || test3)

to obtain

Code
if(test1 && (test2 || test3))

then I want the "()"

mariocup

  • Guest
Re: about bracecompletion
« Reply #4 on: August 17, 2009, 10:23:21 am »
Hi killerbot,

this is desirable too, but not a contradiction if we modify the condition for adding braces.

For example if the next char is a closing brace and you add a new "(" then "()" can be inserted, but in a case like

Code
if (test && "(" test2)

the closing brace should not be added automatically in my eyes, since the user will have to delete the "unwanted" closing brace and this can be very annoying after some time and will not increase the productivity.


Offline blueshake

  • Regular
  • ***
  • Posts: 459
Re: about bracecompletion
« Reply #5 on: August 17, 2009, 11:55:39 am »
I think mariocup is right.
so these codes can be changed to be so.add a ) will work.
Code
const wxString unWant(_T(")\n\r\t\b "));
see my attachment.
snap1 is new one , the {} will stay in the some line.
snap3 is old one, the {} will stay in twol line.
snap2 is example ,the next char is m ,so bracecompletion will not work.it will work if next one is  enter whitesapce , tab or ) (new added).

[attachment deleted by admin]
« Last Edit: August 17, 2009, 11:57:11 am by blueshake »
Keep low and hear the sadness of little dog.
I fall in love with a girl,but I don't dare to tell her.What should I do?

Offline killerbot

  • Administrator
  • Lives here!
  • *****
  • Posts: 5491
Re: about bracecompletion
« Reply #6 on: August 17, 2009, 08:09:33 pm »
and what will happen in your code when :

Code
int main
{
Will the closing '}' end up on the next line ? I think it should.

Offline blueshake

  • Regular
  • ***
  • Posts: 459
Re: about bracecompletion
« Reply #7 on: August 18, 2009, 02:25:54 am »
yes,it will work like below.
Code
int main
{
}

hi, killerbot, have any plan to on this patch.
Keep low and hear the sadness of little dog.
I fall in love with a girl,but I don't dare to tell her.What should I do?

Offline killerbot

  • Administrator
  • Lives here!
  • *****
  • Posts: 5491
Re: about bracecompletion
« Reply #8 on: August 18, 2009, 09:09:29 am »
I just applied it to my local copy, and will test it out.

Offline blueshake

  • Regular
  • ***
  • Posts: 459
Re: about bracecompletion
« Reply #9 on: August 18, 2009, 09:14:14 am »
nice to hear that ,
here is my new patch.
the opening { work like this now ,it is more like what visual assist do.
see the attachment.
Code
Index: cbeditor.cpp
===================================================================
--- cbeditor.cpp (revision 5731)
+++ cbeditor.cpp (working copy)
@@ -331,19 +331,25 @@
         }
         if ( IsCharacterOrString(style) )
             return;
-        wxString leftBrace(_T("([{"));
-        wxString rightBrace(_T(")]}"));
+        const wxString leftBrace(_T("([{"));
+        const wxString rightBrace(_T(")]}"));
         int index = leftBrace.find(ch);
-        if (index != wxNOT_FOUND)
+        const wxString unWant(_T(")\n\r\t\b "));
+        if (index != wxNOT_FOUND && unWant.find(control->GetCharAt(pos)) != wxNOT_FOUND)
         {
-            control->AddText(rightBrace.GetChar(index));
-            control->GotoPos(pos);
-            if (ch == _T('{'))
-            {
-                control->NewLine();
+                control->AddText(rightBrace.GetChar(index));
                 control->GotoPos(pos);
-                return;
-            }
+                if (ch == _T('{'))
+                {
+                    const wxRegEx reg(_T("^[ \t]*{}[ \t]*"));
+                    if (reg.Matches(control->GetCurLine()))
+                    {
+                        control->NewLine();
+                        control->GotoPos(pos);
+                        control->NewLine();
+                        return;
+                    }
+                }
         }
         else
         {


[attachment deleted by admin]
Keep low and hear the sadness of little dog.
I fall in love with a girl,but I don't dare to tell her.What should I do?

Offline killerbot

  • Administrator
  • Lives here!
  • *****
  • Posts: 5491
Re: about bracecompletion
« Reply #10 on: August 18, 2009, 09:54:48 am »
updated my copy with your change.

I already have a first point of feedback :

the following no longer works :
Code
if( --> if()
then I change this into:
Code
if(true &&)
All is still OK, but now it goes wrong
Code
if(true && ()
--> I don't get the closing one !!! And in this case I do want it.

Offline blueshake

  • Regular
  • ***
  • Posts: 459
Re: about bracecompletion
« Reply #11 on: August 18, 2009, 10:27:15 am »
hi,killerbot,it work for me,
see my attachment.
when i type if( and closing ) will automaticlly add.
Code
if(true && |)
in the "|" positon ,i type ( and it work too.
can you just give me more informations?

[attachment deleted by admin]
Keep low and hear the sadness of little dog.
I fall in love with a girl,but I don't dare to tell her.What should I do?

Offline killerbot

  • Administrator
  • Lives here!
  • *****
  • Posts: 5491
Re: about bracecompletion
« Reply #12 on: August 18, 2009, 10:56:51 am »
I just tried it again, and again I end up with :
Code
if(true && ()

could you copy paste here the codesnippet you have of the method you changed, so not as a patch, but just plain code. Maybe I didn't apply your patch correctly ...

Offline blueshake

  • Regular
  • ***
  • Posts: 459
Re: about bracecompletion
« Reply #13 on: August 18, 2009, 11:39:40 am »
hi,killerbot,i paste the the codes,and upload the file as a attachment.

Code
    void DoBraceCompletion(const wxChar& ch)
    {
        cbStyledTextCtrl* control = m_pOwner->GetControl();
        int pos = control->GetCurrentPos();
        int style = control->GetStyleAt(pos);
        if ( IsComment(style) || IsPreprocessor(style) )
            return;
        if ( ch == _T('\'') )
        {
            if ( control->GetCharAt(pos) == ch && pos > 1 && control->GetCharAt(pos-2) != _T('\\') )
            {
                control->DeleteBack();
                control->GotoPos(pos);
            }
            else
            {
                if ( control->GetCharAt(pos-2) == _T('\\') || IsCharacterOrString(style) )
                    return;
                control->AddText(ch);
                control->GotoPos(pos);
            }
            return;
        }
        if ( ch == _T('"') )
        {
            if (control->GetCharAt(pos) == ch && pos > 1 && control->GetCharAt(pos-2) != _T('\\') )
            {
                control->DeleteBack();
                control->GotoPos(pos);
            }
            else
            {
                if ( control->GetCharAt(pos-2) == _T('\\') || IsCharacter(style) )
                    return;
                control->AddText(ch);
                control->GotoPos(pos);
            }
            return;
        }
        if ( IsCharacterOrString(style) )
            return;
        const wxString leftBrace(_T("([{"));
        const wxString rightBrace(_T(")]}"));
        int index = leftBrace.find(ch);
        const wxString unWant(_T(")\n\r\t\b "));
        if (index != wxNOT_FOUND && unWant.find(control->GetCharAt(pos)) != wxNOT_FOUND)
        {
                control->AddText(rightBrace.GetChar(index));
                control->GotoPos(pos);
                if (ch == _T('{'))
                {
                    const wxRegEx reg(_T("^[ \t]*{}[ \t]*"));
                    if (reg.Matches(control->GetCurLine()))
                    {
                        control->NewLine();
                        control->GotoPos(pos);
                        control->NewLine();
                        return;
                    }
                }
        }
        else
        {
            index = rightBrace.find(ch);
            if (index != wxNOT_FOUND)
            {
                if (control->GetCharAt(pos) == ch)
                {
                    control->DeleteBack();
                    control->GotoPos(pos);
                    return;
                }
            }
        }
    }

[attachment deleted by admin]
Keep low and hear the sadness of little dog.
I fall in love with a girl,but I don't dare to tell her.What should I do?

Offline killerbot

  • Administrator
  • Lives here!
  • *****
  • Posts: 5491
Re: about bracecompletion
« Reply #14 on: August 18, 2009, 01:05:30 pm »
I can confirm it works now.
I didn't have the ')' in :
Code
const wxString unWant(_T(")\n\r\t\b "));
   :oops: