Author Topic: about bracecompletion  (Read 15922 times)

Offline killerbot

  • Administrator
  • Lives here!
  • *****
  • Posts: 5491
Re: about bracecompletion
« Reply #15 on: August 18, 2009, 02:33:25 pm »
Would you agree to add to the ';' to the unWant list. I think it should be added.

I ran in to an issue like this.

Current code :
Code
m_Timer->IsEllapsed;

I add the ( :

Code
m_Timer->IsEllapsed(;

but nothing happens. With my change, it works ok, and one obtains :
Code
m_Timer->IsEllapsed();

The same could be sai for the ',' operator

Offline blueshake

  • Regular
  • ***
  • Posts: 459
Re: about bracecompletion
« Reply #16 on: August 18, 2009, 03:37:03 pm »
actually ,in visual assist ,if IsEllapsed is a function ,the () will be added automaticlly,so the ;
is not in the unWant list.
i try to make a patch  for codecompletion to implemet the function.and it is easy to.
but the problem is :
if the function have argument.so caret position should be like this.
IsEllapsed(|). and I have no any chance to get what exactly item is completed in suggestion list.
the caret can not goto the right postion when the fucntion has argument.
so i have no idea about this issue.just do it if it is necessary.
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 #17 on: August 18, 2009, 03:47:37 pm »
our code completion currently just adds the function name, no (...).

Offline blueshake

  • Regular
  • ***
  • Posts: 459
Re: about bracecompletion
« Reply #18 on: August 19, 2009, 10:26:49 am »
hi,
recently,i am going to make a patch,its function is
when you delete a ([{ and the right char is )]} ,so the the relative one will be deleted too.
for example
Code
int main(|)
int the "|" position ,you delete "(" and the ")" should be deleted too.
but i face a problem,
it seems that these codes can not work.the caret moved,but the ) didn't be delete.
any one have any idea about this?
these codes seems not be executed .
Code
m_pControl->DeleteBack();

here are the codes.
Code
void cbEditor::OnEditorModified(wxScintillaEvent& event)
{
//    wxString txt = _T("OnEditorModified(): ");
//    int flags = event.GetModificationType();
//    if (flags & wxSCI_MOD_CHANGEMARKER) txt << _T("wxSCI_MOD_CHANGEMARKER, ");
//    if (flags & wxSCI_MOD_INSERTTEXT) txt << _T("wxSCI_MOD_INSERTTEXT, ");
//    if (flags & wxSCI_MOD_DELETETEXT) txt << _T("wxSCI_MOD_DELETETEXT, ");
//    if (flags & wxSCI_MOD_CHANGEFOLD) txt << _T("wxSCI_MOD_CHANGEFOLD, ");
//    if (flags & wxSCI_PERFORMED_USER) txt << _T("wxSCI_PERFORMED_USER, ");
//    if (flags & wxSCI_MOD_BEFOREINSERT) txt << _T("wxSCI_MOD_BEFOREINSERT, ");
//    if (flags & wxSCI_MOD_BEFOREDELETE) txt << _T("wxSCI_MOD_BEFOREDELETE, ");
//    txt << _T("pos=")
//        << wxString::Format(_T("%d"), event.GetPosition())
//        << _T(", line=")
//        << wxString::Format(_T("%d"), event.GetLine())
//        << _T(", linesAdded=")
//        << wxString::Format(_T("%d"), event.GetLinesAdded());
//    Manager::Get()->GetLogManager()->DebugLog(txt);

    // whenever event.GetLinesAdded() != 0, we must re-set breakpoints for lines greater
    // than LineFromPosition(event.GetPosition())
    int linesAdded = event.GetLinesAdded();
    bool isAdd = event.GetModificationType() & wxSCI_MOD_INSERTTEXT;
    bool isDel = event.GetModificationType() & wxSCI_MOD_DELETETEXT;
    if ((isAdd || isDel) && linesAdded != 0)
    {
        // in case of no line numbers to be shown no need to set
        // NOTE : on every modification of the Editor we consult ConfigManager
        //        hopefully not to time consuming, otherwise we make a member out of it
        ConfigManager* mgr = Manager::Get()->GetConfigManager(_T("editor"));
        if (mgr->ReadBool(_T("/show_line_numbers"), true))
        {
            m_pData->SetLineNumberColWidth();
        }

        // NB: I don't think polling for each debugger every time will slow things down enough
        // to worry about unless there are automated tasks that call this routine regularly
        //
        // well, scintilla events happen regularly
        // although we only reach this part of the code only if a line has been added/removed
        // so, yes, it might not be that bad after all
        PluginsArray arr = Manager::Get()->GetPluginManager()->GetOffersFor(ptDebugger);
        int startline = m_pControl->LineFromPosition(event.GetPosition());
        for(size_t i=0;i<arr.GetCount();i++)
        {
            cbDebuggerPlugin* debugger = (cbDebuggerPlugin*)arr[i];
            debugger->EditorLinesAddedOrRemoved(this, startline, linesAdded);
        }

    }
    if (isDel)
    {
        Manager::Get()->GetLogManager()->DebugLog(event.GetText());
        Manager::Get()->GetLogManager()->DebugLog(F(_T("delete   %d"),event.GetText().size()));
        if (event.GetText().size() == 1)
        {
            const wxString leftBrace(_T("([{"));
            const wxString rightBrace(_T(")]}"));
            int left = leftBrace.find(event.GetText()[0]);
            if (left != wxNOT_FOUND)
            {
                wxChar ch = m_pControl->GetCharAt(event.GetPosition());
                int right = rightBrace.find(ch);
                if (right != wxNOT_FOUND && right == left)
                {
                    m_pControl->GotoPos(event.GetPosition() + 1);
                    m_pControl->DeleteBack();
                 
                }

            }

        }
    }

    OnScintillaEvent(event);
} // end of OnEditorModified
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 #19 on: August 22, 2009, 09:17:15 am »
I have tested the patch now for more then a week (not related to the topic on the reply before this one) and I will apply it today to the trunk.

Offline blueshake

  • Regular
  • ***
  • Posts: 459
Re: about bracecompletion
« Reply #20 on: August 22, 2009, 09:33:29 am »
nice to hear that . :D
by the way, what is your idea about reply #18?
this confuse me for several days.
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 #21 on: August 22, 2009, 09:42:21 am »
applied and many thanks for the contribution  :P

I have no idea 'm_pControl->DeleteBack();' why this does not work. I should study the class of m_pControl again first.

Offline ollydbg

  • Developer
  • Lives here!
  • *****
  • Posts: 5915
  • OpenCV and Robotics
    • Chinese OpenCV forum moderator
Re: about bracecompletion
« Reply #22 on: August 28, 2009, 01:12:30 pm »
hi,
recently,i am going to make a patch,its function is
when you delete a ([{ and the right char is )]} ,so the the relative one will be deleted too.
for example
Code
int main(|)
int the "|" position ,you delete "(" and the ")" should be deleted too.
but i face a problem,
it seems that these codes can not work.the caret moved,but the ) didn't be delete.
any one have any idea about this?
these codes seems not be executed .
Code
m_pControl->DeleteBack();

here are the codes.
Code
void cbEditor::OnEditorModified(wxScintillaEvent& event)
{
//    wxString txt = _T("OnEditorModified(): ");
//    int flags = event.GetModificationType();
//    if (flags & wxSCI_MOD_CHANGEMARKER) txt << _T("wxSCI_MOD_CHANGEMARKER, ");
//    if (flags & wxSCI_MOD_INSERTTEXT) txt << _T("wxSCI_MOD_INSERTTEXT, ");
//    if (flags & wxSCI_MOD_DELETETEXT) txt << _T("wxSCI_MOD_DELETETEXT, ");
//    if (flags & wxSCI_MOD_CHANGEFOLD) txt << _T("wxSCI_MOD_CHANGEFOLD, ");
//    if (flags & wxSCI_PERFORMED_USER) txt << _T("wxSCI_PERFORMED_USER, ");
//    if (flags & wxSCI_MOD_BEFOREINSERT) txt << _T("wxSCI_MOD_BEFOREINSERT, ");
//    if (flags & wxSCI_MOD_BEFOREDELETE) txt << _T("wxSCI_MOD_BEFOREDELETE, ");
//    txt << _T("pos=")
//        << wxString::Format(_T("%d"), event.GetPosition())
//        << _T(", line=")
//        << wxString::Format(_T("%d"), event.GetLine())
//        << _T(", linesAdded=")
//        << wxString::Format(_T("%d"), event.GetLinesAdded());
//    Manager::Get()->GetLogManager()->DebugLog(txt);

    // whenever event.GetLinesAdded() != 0, we must re-set breakpoints for lines greater
    // than LineFromPosition(event.GetPosition())
    int linesAdded = event.GetLinesAdded();
    bool isAdd = event.GetModificationType() & wxSCI_MOD_INSERTTEXT;
    bool isDel = event.GetModificationType() & wxSCI_MOD_DELETETEXT;
    if ((isAdd || isDel) && linesAdded != 0)
    {
        // in case of no line numbers to be shown no need to set
        // NOTE : on every modification of the Editor we consult ConfigManager
        //        hopefully not to time consuming, otherwise we make a member out of it
        ConfigManager* mgr = Manager::Get()->GetConfigManager(_T("editor"));
        if (mgr->ReadBool(_T("/show_line_numbers"), true))
        {
            m_pData->SetLineNumberColWidth();
        }

        // NB: I don't think polling for each debugger every time will slow things down enough
        // to worry about unless there are automated tasks that call this routine regularly
        //
        // well, scintilla events happen regularly
        // although we only reach this part of the code only if a line has been added/removed
        // so, yes, it might not be that bad after all
        PluginsArray arr = Manager::Get()->GetPluginManager()->GetOffersFor(ptDebugger);
        int startline = m_pControl->LineFromPosition(event.GetPosition());
        for(size_t i=0;i<arr.GetCount();i++)
        {
            cbDebuggerPlugin* debugger = (cbDebuggerPlugin*)arr[i];
            debugger->EditorLinesAddedOrRemoved(this, startline, linesAdded);
        }

    }
    if (isDel)
    {
        Manager::Get()->GetLogManager()->DebugLog(event.GetText());
        Manager::Get()->GetLogManager()->DebugLog(F(_T("delete   %d"),event.GetText().size()));
        if (event.GetText().size() == 1)
        {
            const wxString leftBrace(_T("([{"));
            const wxString rightBrace(_T(")]}"));
            int left = leftBrace.find(event.GetText()[0]);
            if (left != wxNOT_FOUND)
            {
                wxChar ch = m_pControl->GetCharAt(event.GetPosition());
                int right = rightBrace.find(ch);
                if (right != wxNOT_FOUND && right == left)
                {
                    m_pControl->GotoPos(event.GetPosition() + 1);
                    m_pControl->DeleteBack();
                 
                }

            }

        }
    }

    OnScintillaEvent(event);
} // end of OnEditorModified

I tested this patch, it seems m_pControl->DeleteBack(); has no effect.
I don't know why...
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Offline Jenna

  • Administrator
  • Lives here!
  • *****
  • Posts: 7255
Re: about bracecompletion
« Reply #23 on: August 28, 2009, 02:00:09 pm »
I tested this patch, it seems m_pControl->DeleteBack(); has no effect.
I don't know why...

If I see it right, you can not modify the Document from inside the document-modified event (at least not call Document::DeletChars(), did not check this for other modifications).
And I think that's good, because it could lead to infinite loops.

Offline ollydbg

  • Developer
  • Lives here!
  • *****
  • Posts: 5915
  • OpenCV and Robotics
    • Chinese OpenCV forum moderator
Re: about bracecompletion
« Reply #24 on: August 28, 2009, 02:11:53 pm »
I tested this patch, it seems m_pControl->DeleteBack(); has no effect.
I don't know why...

If I see it right, you can not modify the Document from inside the document-modified event (at least not call Document::DeletChars(), did not check this for other modifications).
And I think that's good, because it could lead to infinite loops.


Thanks.

It is a reasonable explanation.

Here comes another question:

How can we do such kind of delete?
If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Offline ollydbg

  • Developer
  • Lives here!
  • *****
  • Posts: 5915
  • OpenCV and Robotics
    • Chinese OpenCV forum moderator
Re: about bracecompletion
« Reply #25 on: August 28, 2009, 04:01:09 pm »
I find the reason in

http://wxcode.sourceforge.net/components/wxscintilla/reference.html

Quote
wxEVT_SCI_MODIFIED

This notification is sent when the text or styling of the document changes or is about to change. You can set a mask for the notifications that are sent to the container with SetModEventMask. The notification structure contains information about what changed, how the change occurred and whether this changed the number of lines in the document. No modifications may be performed while in a wxEVT_SCI_MODIFIED event.


If some piece of memory should be reused, turn them to variables (or const variables).
If some piece of operations should be reused, turn them to functions.
If they happened together, then turn them to classes.

Offline Jenna

  • Administrator
  • Lives here!
  • *****
  • Posts: 7255
Re: about bracecompletion
« Reply #26 on: August 28, 2009, 05:37:38 pm »
That's more or less what I wrote.
I did not look at the (wx)Scintilla-documentation, but in the sources (they use a counter to avoid multiple modifications at the same time).