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.
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
{
could you give some examples of the improvements [before/after] ?
Hi blueshake,
Quote from: blueshake on August 17, 2009, 05:28:44 AM
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
if (variable1 && variable2)
and now modify the condition
if (variable1 && (
then I do not want to add instantly the closing bracket, since this is not the desired place.
but what if you have the following
if(test1)
and you want to add something like
&& (test2 || test3)
to obtain
if(test1 && (test2 || test3))
then I want the "()"
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
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.
I think mariocup is right.
so these codes can be changed to be so.add a ) will work.
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]
and what will happen in your code when :
int main
{
Will the closing '}' end up on the next line ? I think it should.
yes,it will work like below.
int main
{
}
hi, killerbot, have any plan to on this patch.
I just applied it to my local copy, and will test it out.
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.
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]
updated my copy with your change.
I already have a first point of feedback :
the following no longer works :
if( --> if()
then I change this into:
if(true &&)
All is still OK, but now it goes wrong
if(true && ()
--> I don't get the closing one !!! And in this case I do want it.
hi,killerbot,it work for me,
see my attachment.
when i type if( and closing ) will automaticlly add.
if(true && |)
in the "|" positon ,i type ( and it work too.
can you just give me more informations?
[attachment deleted by admin]
I just tried it again, and again I end up with :
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 ...
hi,killerbot,i paste the the codes,and upload the file as a attachment.
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]
I can confirm it works now.
I didn't have the ')' in :
const wxString unWant(_T(")\n\r\t\b ")); :oops:
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 :
m_Timer->IsEllapsed;
I add the ( :
m_Timer->IsEllapsed(;
but nothing happens. With my change, it works ok, and one obtains :
m_Timer->IsEllapsed();
The same could be sai for the ',' operator
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.
our code completion currently just adds the function name, no (...).
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
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 .
m_pControl->DeleteBack();
here are the codes.
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 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.
nice to hear that . :D
by the way, what is your idea about reply #18?
this confuse me for several days.
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.
Quote from: blueshake 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
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 .
m_pControl->DeleteBack();
here are the codes.
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...
Quote from: ollydbg on August 28, 2009, 01:12:30 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.
Quote from: jens on August 28, 2009, 02:00:09 PM
Quote from: ollydbg on August 28, 2009, 01:12:30 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?
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.
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).