Index: src/sdk/editorconfigurationdlg.cpp
===================================================================
--- src/sdk/editorconfigurationdlg.cpp	(revision 7582)
+++ src/sdk/editorconfigurationdlg.cpp	(working copy)
@@ -20,7 +20,7 @@
     #include <wx/stattext.h>
     #include <wx/textdlg.h>
     #include <wx/xrc/xmlres.h>
-    
+
     #include "manager.h"
     #include "configmanager.h"
     #include "pluginmanager.h"
@@ -118,6 +118,7 @@
     XRCCTRL(*this, "chkUseChangebar", wxCheckBox)->SetValue(m_EnableChangebar);
     XRCCTRL(*this, "chkShowIndentGuides", wxCheckBox)->SetValue(cfg->ReadBool(_T("/show_indent_guides"), false));
     XRCCTRL(*this, "chkBraceSmartIndent", wxCheckBox)->SetValue(cfg->ReadBool(_T("/brace_smart_indent"), true));
+    XRCCTRL(*this, "chkSelectionBraceCompletion", wxCheckBox)->SetValue(cfg->ReadBool(_T("/selection_brace_completion"), false));
     XRCCTRL(*this, "chkTabIndents", wxCheckBox)->SetValue(cfg->ReadBool(_T("/tab_indents"), true));
     XRCCTRL(*this, "chkBackspaceUnindents", wxCheckBox)->SetValue(cfg->ReadBool(_T("/backspace_unindents"), true));
     XRCCTRL(*this, "chkWordWrap", wxCheckBox)->SetValue(cfg->ReadBool(_T("/word_wrap"), false));
@@ -795,6 +796,7 @@
         cfg->Write(_T("/use_tab"),                             XRCCTRL(*this, "chkUseTab", wxCheckBox)->GetValue());
         cfg->Write(_T("/show_indent_guides"),                  XRCCTRL(*this, "chkShowIndentGuides", wxCheckBox)->GetValue());
         cfg->Write(_T("/brace_smart_indent"),                  XRCCTRL(*this, "chkBraceSmartIndent", wxCheckBox)->GetValue());
+        cfg->Write(_T("/selection_brace_completion"),          XRCCTRL(*this, "chkSelectionBraceCompletion", wxCheckBox)->GetValue());
         cfg->Write(_T("/tab_indents"),                         XRCCTRL(*this, "chkTabIndents", wxCheckBox)->GetValue());
         cfg->Write(_T("/backspace_unindents"),                 XRCCTRL(*this, "chkBackspaceUnindents", wxCheckBox)->GetValue());
         cfg->Write(_T("/word_wrap"),                           XRCCTRL(*this, "chkWordWrap", wxCheckBox)->GetValue());
Index: src/sdk/cbeditor.cpp
===================================================================
--- src/sdk/cbeditor.cpp	(revision 7582)
+++ src/sdk/cbeditor.cpp	(working copy)
@@ -2897,7 +2897,7 @@
             wxTreeItemId sel = Manager::Get()->GetProjectManager()->GetTreeSelection();
             if (sel.IsOk())
                 tree->SelectItem(sel, false);
-            
+
             const wxTreeItemId &itemId = m_pProjectFile->GetTreeItemId();
             if (itemId.IsOk())
             {
@@ -3022,6 +3022,104 @@
     static int autoUnIndentValue = -1;
     static int autoUnIndentLine = -1;
 
+    bool SelectionBraceCompletion = Manager::Get()->GetConfigManager(_T("editor"))->ReadBool(_T("/selection_brace_completion"), false);
+    if (SelectionBraceCompletion && !control->GetLastSelectedText().IsEmpty())
+    {
+        wxString selectedText = control->GetLastSelectedText();
+        switch (ch)
+        {
+            case _T('\''):
+            {
+                control->BeginUndoAction();
+                control->DeleteBack();
+                selectedText.Replace(wxT("\\'"), wxT("'"));
+                selectedText.Replace(wxT("'"), wxT("\\'"));
+                control->InsertText(pos - 1, wxT("'") + selectedText + wxT("'"));
+                control->SetEmptySelection(pos + selectedText.Length() + 1);
+                control->EndUndoAction();
+                return;
+            }
+            case _T('"'):
+            {
+                control->BeginUndoAction();
+                control->DeleteBack();
+                selectedText.Replace(wxT("\\\""), wxT("\""));
+                selectedText.Replace(wxT("\""), wxT("\\\""));
+                control->InsertText(pos - 1, wxT("\"") + selectedText + wxT("\""));
+                control->SetCurrentPos(pos + selectedText.Length() + 1);
+                control->EndUndoAction();
+                return;
+            }
+            case _T('('):
+            case _T(')'):
+            {
+                control->BeginUndoAction();
+                control->DeleteBack();
+                control->InsertText(pos - 1, wxT("(") + selectedText + wxT(")"));
+                if(ch == _T(')'))
+                {
+                    control->SetEmptySelection(pos + selectedText.Length() + 1);
+                }
+                control->EndUndoAction();
+                return;
+            }
+            case _T('['):
+            case _T(']'):
+            {
+                control->BeginUndoAction();
+                control->DeleteBack();
+                control->InsertText(pos - 1, wxT("[") + selectedText + wxT("]"));
+                if(ch == _T(']'))
+                {
+                    control->SetEmptySelection(pos + selectedText.Length() + 1);
+                }
+                control->EndUndoAction();
+                return;
+            }
+            case _T('<'):
+            case _T('>'):
+            {
+                control->BeginUndoAction();
+                control->DeleteBack();
+                control->InsertText(pos - 1, wxT("<") + selectedText + wxT(">"));
+                if(ch == _T('>'))
+                {
+                    control->SetEmptySelection(pos + selectedText.Length() + 1);
+                }
+                control->EndUndoAction();
+                return;
+            }
+            case _T('{'):
+            case _T('}'):
+            {
+                control->BeginUndoAction();
+                control->DeleteBack();
+                control->InsertText(pos - 1, selectedText);
+                control->SetSelectionVoid(pos - 1, pos + selectedText.Length() - 1);
+                int startLine = control->LineFromPosition(control->GetSelectionStart());
+                int endLine = control->LineFromPosition(control->GetSelectionEnd());
+                if(startLine == endLine)
+                {
+                    control->Home();
+                }
+                control->Tab();
+                control->SetEmptySelection(control->GetLineEndPosition(endLine));
+                control->NewLine();
+                control->BackTab();
+                control->InsertText(control->GetCurrentPos(), wxT("}"));
+                control->SetEmptySelection(control->GetLineEndPosition(startLine - 1));
+                control->NewLine();
+                control->InsertText(control->GetCurrentPos(), wxT("{"));
+                if(ch == _T('}'))
+                {
+                    control->SetEmptySelection(control->GetLineEndPosition(endLine + 2));
+                }
+                control->EndUndoAction();
+                return;
+            }
+        }
+    }
+
     // indent
     if (ch == _T('\n'))
     {
Index: src/sdk/cbstyledtextctrl.cpp
===================================================================
--- src/sdk/cbstyledtextctrl.cpp	(revision 7582)
+++ src/sdk/cbstyledtextctrl.cpp	(working copy)
@@ -123,6 +123,8 @@
 
 void cbStyledTextCtrl::OnKeyDown(wxKeyEvent& event)
 {
+    m_lastSelectedText = GetSelectedText();
+
     switch (event.GetKeyCode())
     {
         case WXK_TAB:
Index: src/sdk/resources/editor_configuration.xrc
===================================================================
--- src/sdk/resources/editor_configuration.xrc	(revision 7582)
+++ src/sdk/resources/editor_configuration.xrc	(working copy)
@@ -154,7 +154,7 @@
 															</object>
 															<object class="sizeritem">
 																<object class="wxStaticBoxSizer">
-																	<label>End-of-line options</label>
+																	<label>Highlight occurrences</label>
 																	<orient>wxVERTICAL</orient>
 																	<object class="sizeritem">
 																		<object class="wxFlexGridSizer">
@@ -162,64 +162,54 @@
 																			<vgap>4</vgap>
 																			<hgap>4</hgap>
 																			<object class="sizeritem">
-																				<object class="wxCheckBox" name="chkShowEOL">
-																					<label>Show end-of-line chars</label>
+																				<object class="wxCheckBox" name="chkHighlightOccurrences">
+																					<label>Highlight occurrences</label>
+																					<checked>1</checked>
 																				</object>
 																				<flag>wxALIGN_LEFT|wxALIGN_TOP</flag>
 																			</object>
 																			<object class="sizeritem">
-																				<object class="wxCheckBox" name="chkStripTrailings">
-																					<label>Strip trailing blanks</label>
+																				<object class="wxCheckBox" name="chkHighlightOccurrencesCaseSensitive">
+																					<label>Case sensitive</label>
 																					<checked>1</checked>
 																				</object>
-																				<flag>wxALIGN_LEFT|wxALIGN_TOP</flag>
+																				<flag>wxLEFT|wxALIGN_LEFT|wxALIGN_TOP</flag>
+																				<border>10</border>
 																			</object>
 																			<object class="sizeritem">
-																				<object class="wxCheckBox" name="chkEnsureFinalEOL">
-																					<label>End files with blank line</label>
+																				<object class="wxCheckBox" name="chkHighlightOccurrencesWholeWord">
+																					<label>Whole words only</label>
+																					<checked>1</checked>
 																				</object>
-																				<flag>wxALIGN_LEFT|wxALIGN_TOP</flag>
+																				<flag>wxLEFT|wxALIGN_LEFT|wxALIGN_TOP</flag>
+																				<border>10</border>
 																			</object>
 																			<object class="sizeritem">
-																				<object class="wxCheckBox" name="chkEnsureConsistentEOL">
-																					<label>Ensure consistent EOLs</label>
-																				</object>
-																				<flag>wxALIGN_LEFT|wxALIGN_TOP</flag>
-																			</object>
-																			<object class="sizeritem">
 																				<object class="wxBoxSizer">
 																					<object class="sizeritem">
-																						<object class="wxStaticText" name="ID_STATICTEXT2">
-																							<label>End-of-line mode:</label>
+																						<object class="wxStaticText" name="stHighlightColour">
+																							<label>Highlight colour</label>
 																						</object>
-																						<flag>wxTOP|wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP</flag>
-																						<border>4</border>
+																						<flag>wxRIGHT|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL</flag>
+																						<border>5</border>
 																					</object>
 																					<object class="sizeritem">
-																						<object class="wxComboBox" name="cmbEOLMode">
-																							<content>
-																								<item>CR LF</item>
-																								<item>CR</item>
-																								<item>LF</item>
-																							</content>
-																							<style>wxCB_READONLY</style>
+																						<object class="wxButton" name="btnHighlightColour">
+																							<label>...</label>
+																							<bg>#FF0000</bg>
 																						</object>
-																						<flag>wxLEFT|wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP</flag>
-																						<border>16</border>
-																						<option>1</option>
+																						<flag>wxALIGN_LEFT|wxALIGN_TOP</flag>
 																					</object>
 																				</object>
-																				<flag>wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP</flag>
-																				<option>1</option>
+																				<flag>wxLEFT|wxALIGN_LEFT|wxALIGN_TOP</flag>
+																				<border>10</border>
 																			</object>
 																		</object>
 																		<flag>wxALL|wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP</flag>
 																		<border>4</border>
-																		<option>1</option>
 																	</object>
 																</object>
 																<flag>wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP</flag>
-																<border>4</border>
 																<option>1</option>
 															</object>
 															<object class="sizeritem">
@@ -260,17 +250,23 @@
 																				<flag>wxALIGN_LEFT|wxALIGN_TOP</flag>
 																			</object>
 																			<object class="sizeritem">
-																				<object class="wxCheckBox" name="chkShowIndentGuides">
-																					<label>Show indentation guides</label>
+																				<object class="wxCheckBox" name="chkBraceSmartIndent">
+																					<label>Brace Smart Indent</label>
 																				</object>
 																				<flag>wxALIGN_LEFT|wxALIGN_TOP</flag>
 																			</object>
 																			<object class="sizeritem">
-																				<object class="wxCheckBox" name="chkBraceSmartIndent">
-																					<label>Brace Smart Indent</label>
+																				<object class="wxCheckBox" name="chkSelectionBraceCompletion">
+																					<label>Selection brace completion</label>
 																				</object>
 																				<flag>wxALIGN_LEFT|wxALIGN_TOP</flag>
 																			</object>
+																			<object class="sizeritem">
+																				<object class="wxCheckBox" name="chkShowIndentGuides">
+																					<label>Show indentation guides</label>
+																				</object>
+																				<flag>wxALIGN_LEFT|wxALIGN_TOP</flag>
+																			</object>
 																		</object>
 																		<flag>wxALL|wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP</flag>
 																		<border>4</border>
@@ -281,7 +277,7 @@
 															</object>
 															<object class="sizeritem">
 																<object class="wxStaticBoxSizer">
-																	<label>Highlight occurrences</label>
+																	<label>End-of-line options</label>
 																	<orient>wxVERTICAL</orient>
 																	<object class="sizeritem">
 																		<object class="wxFlexGridSizer">
@@ -289,54 +285,64 @@
 																			<vgap>4</vgap>
 																			<hgap>4</hgap>
 																			<object class="sizeritem">
-																				<object class="wxCheckBox" name="chkHighlightOccurrences">
-																					<label>Highlight occurrences</label>
-																					<checked>1</checked>
+																				<object class="wxCheckBox" name="chkShowEOL">
+																					<label>Show end-of-line chars</label>
 																				</object>
 																				<flag>wxALIGN_LEFT|wxALIGN_TOP</flag>
 																			</object>
 																			<object class="sizeritem">
-																				<object class="wxCheckBox" name="chkHighlightOccurrencesCaseSensitive">
-																					<label>Case sensitive</label>
+																				<object class="wxCheckBox" name="chkStripTrailings">
+																					<label>Strip trailing blanks</label>
 																					<checked>1</checked>
 																				</object>
-																				<flag>wxLEFT|wxALIGN_LEFT|wxALIGN_TOP</flag>
-																				<border>10</border>
+																				<flag>wxALIGN_LEFT|wxALIGN_TOP</flag>
 																			</object>
 																			<object class="sizeritem">
-																				<object class="wxCheckBox" name="chkHighlightOccurrencesWholeWord">
-																					<label>Whole words only</label>
-																					<checked>1</checked>
+																				<object class="wxCheckBox" name="chkEnsureFinalEOL">
+																					<label>End files with blank line</label>
 																				</object>
-																				<flag>wxLEFT|wxALIGN_LEFT|wxALIGN_TOP</flag>
-																				<border>10</border>
+																				<flag>wxALIGN_LEFT|wxALIGN_TOP</flag>
 																			</object>
 																			<object class="sizeritem">
+																				<object class="wxCheckBox" name="chkEnsureConsistentEOL">
+																					<label>Ensure consistent EOLs</label>
+																				</object>
+																				<flag>wxALIGN_LEFT|wxALIGN_TOP</flag>
+																			</object>
+																			<object class="sizeritem">
 																				<object class="wxBoxSizer">
 																					<object class="sizeritem">
-																						<object class="wxStaticText" name="stHighlightColour">
-																							<label>Highlight colour</label>
+																						<object class="wxStaticText" name="ID_STATICTEXT2">
+																							<label>End-of-line mode:</label>
 																						</object>
-																						<flag>wxRIGHT|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL</flag>
-																						<border>5</border>
+																						<flag>wxTOP|wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP</flag>
+																						<border>4</border>
 																					</object>
 																					<object class="sizeritem">
-																						<object class="wxButton" name="btnHighlightColour">
-																							<label>...</label>
-																							<bg>#FF0000</bg>
+																						<object class="wxComboBox" name="cmbEOLMode">
+																							<content>
+																								<item>CR LF</item>
+																								<item>CR</item>
+																								<item>LF</item>
+																							</content>
+																							<style>wxCB_READONLY</style>
 																						</object>
-																						<flag>wxALIGN_LEFT|wxALIGN_TOP</flag>
+																						<flag>wxLEFT|wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP</flag>
+																						<border>16</border>
+																						<option>1</option>
 																					</object>
 																				</object>
-																				<flag>wxLEFT|wxALIGN_LEFT|wxALIGN_TOP</flag>
-																				<border>10</border>
+																				<flag>wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP</flag>
+																				<option>1</option>
 																			</object>
 																		</object>
 																		<flag>wxALL|wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP</flag>
 																		<border>4</border>
+																		<option>1</option>
 																	</object>
 																</object>
 																<flag>wxEXPAND|wxALIGN_LEFT|wxALIGN_TOP</flag>
+																<border>4</border>
 																<option>1</option>
 															</object>
 														</object>