Feature #4532 2009-03-16 18:43

bozo_le_fou

Codecompletion Keyboard code Goto Impl

It could be interesting to have a keyboard shortcut that allow to follow declaration or implementation of a keyword.

Category
Plugins
Status
Open
Close date
 
Assigned to
 
bozo_le_fou 2009-03-16 18:45
I don't know how to do on this site but i made the patch for
this
------
Index: codecompletion/codecompletion.cpp
===================================================================
--- codecompletion/codecompletion.cpp	(rvision 1)
+++ codecompletion/codecompletion.cpp	(copie de travail)
@@ -120,6 +120,10 @@
 int idEditorSubMenu = wxNewId();
 int idClassMethod = wxNewId();
 int idUnimplementedClassMethods = wxNewId();
+//DeclTmp
+int idGotoImplDecl = wxNewId();
+int idComefromImplDecl = wxNewId();
+
 int idGotoDeclaration = wxNewId();
 int idGotoImplementation = wxNewId();
 int idOpenIncludeFile = wxNewId();
@@ -140,6 +144,10 @@
     EVT_MENU(idMenuGotoNextFunction,
CodeCompletion::OnGotoNextFunction)
     EVT_MENU(idClassMethod, CodeCompletion::OnClassMethod)
     EVT_MENU(idUnimplementedClassMethods,
CodeCompletion::OnUnimplementedClassMethods)
+    //DeclTmp
+    EVT_MENU(idGotoImplDecl,
CodeCompletion::OnGotoImplDeclRecursive)
+    EVT_MENU(idComefromImplDecl,
CodeCompletion::OnComefromImplDeclRecursive)
+
     EVT_MENU(idGotoDeclaration,
CodeCompletion::OnGotoDeclaration)
     EVT_MENU(idGotoImplementation,
CodeCompletion::OnGotoDeclaration)
     EVT_MENU(idOpenIncludeFile,
CodeCompletion::OnOpenIncludeFile)
@@ -263,6 +271,9 @@
         m_SearchMenu->Append(idMenuGotoFunction, _("Goto
function...\tCtrl-Alt-G"));
         m_SearchMenu->Append(idMenuGotoPrevFunction,
_("Goto previous function\tCtrl-PgUp"));
         m_SearchMenu->Append(idMenuGotoNextFunction,
_("Goto next function\tCtrl-PgDn"));
+        m_SearchMenu->Append(idGotoImplDecl, _("Goto
impl/decl...\tF6"));
+        m_SearchMenu->Append(idComefromImplDecl,
_("Comefrom decl/impl...\tShift+F6"));
+
     }
     else
         Manager::Get()->GetLogManager()->DebugLog(_T("Could
not find Search menu!"));
@@ -1007,7 +1018,7 @@
     m_InitDone = true;
 
 	// Dreaded DDE-open bug related: do not touch the
following lines unless for a good reason
-    
+
     // parse any projects opened through DDE or the
command-line
     ParseActiveProjects();
     ProjectManager* prjMan =
Manager::Get()->GetProjectManager();
@@ -1595,6 +1606,63 @@
     DoAllMethodsImpl();
 }
 
+void
CodeCompletion::OnGotoImplDeclRecursive(wxCommandEvent& event)
+{
+
+  cbEditor* ed =
Manager::Get()->GetEditorManager()->GetBuiltinActiveEditor();
+  cbStyledTextCtrl* control = ed->GetControl();
+
+  int pos = control->GetCurrentPos();
+  int ws = control->WordStartPosition(pos, true);
+  int we = control->WordEndPosition(pos, true);
+  wxString txt = control->GetTextRange(ws, we);
+  m_LastKeyword=txt;
+  m_listLastKeyword.push_back(txt);
+
+  FunctionScope fs;
+  fs.Name=txt;
+  fs.StartLine=ed->GetControl()->GetCurrentLine();
+  fs.Scope=ed->GetFilename();
+  m_listLastPositions.push_back(fs);
+
+
+  if (m_listLastPositions.size()>=2)
+  {
+    FunctionsScopeVec::reverse_iterator rii;
+    rii=m_listLastPositions.rbegin();
+    rii++;
+    if(fs.Name==(rii->Name))
+    {
+      event.SetId(idGotoDeclaration);
+
+      if ((m_listLastPositions.size()>2))
+      {
+        ++rii;
+        if ((rii)->Name == (m_listLastPositions.back().Name))
+          m_listLastPositions.pop_back();
+      }
+    }
+  }
+
+  OnGotoDeclaration(event);
+}
+
+void
CodeCompletion::OnComefromImplDeclRecursive(wxCommandEvent&
event)
+{
+
+
+  if (m_listLastPositions.size()>0)
+  {
+
+    FunctionScope fs=m_listLastPositions.back();
+    EditorManager* edMan = Manager::Get()->GetEditorManager();
+    cbEditor* ed =edMan->Open(fs.Scope);
+    ed->GotoLine(fs.StartLine);
+
+    m_listLastPositions.pop_back();
+  }
+
+}
 void CodeCompletion::OnGotoDeclaration(wxCommandEvent& event)
 {
     EditorManager* edMan = Manager::Get()->GetEditorManager();
@@ -1632,7 +1700,9 @@
             {
                 // only match tokens that have filename info
                 if ((event.GetId() == idGotoImplementation
&& !sel->GetImplFilename().IsEmpty()) ||
-                    (event.GetId() == idGotoDeclaration &&
!sel->GetFilename().IsEmpty()))
+                    (event.GetId() == idGotoDeclaration &&
!sel->GetFilename().IsEmpty()) ||
+                    (event.GetId() == idGotoImplDecl &&
!sel->GetImplFilename().IsEmpty()) ||
+                    (event.GetId() == idComefromImplDecl &&
!sel->GetImplFilename().IsEmpty()))
                 {
                     selections.Add(sel->DisplayName());
                     int_selections.Add(*it);
@@ -1656,13 +1726,33 @@
     // do we have a token?
     if (token)
     {
-        if(event.GetId() == idGotoImplementation)
+        if(event.GetId() == idGotoImplementation ||
event.GetId() == idGotoImplDecl || event.GetId() ==
idComefromImplDecl)
         {
             cbEditor* ed =
edMan->Open(token->GetImplFilename());
             if (ed)
+            {
                 ed->GotoLine(token->m_ImplLine - 1);
+
+            }
+            else if (event.GetId() == idGotoImplDecl ||
event.GetId() == idComefromImplDecl)
+            {
+              ed = edMan->Open(token->GetFilename());
+              if (ed)
+              {
+                ed->GotoLine(token->m_Line - 1);
+
+              }
+              else
+              {
+               
cbMessageBox(wxString::Format(_("Impl/Declaration not found:
%s"), txt.c_str()), _("Warning"), wxICON_WARNING);
+              }
+            }
             else
-               
cbMessageBox(wxString::Format(_("Implementation not found:
%s"), txt.c_str()), _("Warning"), wxICON_WARNING);
+            {
+            //If no Implementation Goto Declaration
+             
cbMessageBox(wxString::Format(_("Implementation not found:
%s"), txt.c_str()), _("Warning"), wxICON_WARNING);
+
+            }
         }
         else
         {
Index: codecompletion/codecompletion.h
===================================================================
--- codecompletion/codecompletion.h	(rvision 1)
+++ codecompletion/codecompletion.h	(copie de travail)
@@ -40,9 +40,11 @@
 		wxString Name;
 	};
 
+
 	typedef std::vector<FunctionScope> FunctionsScopeVec;
 	typedef std::vector<NameSpace> NameSpaceVec;
 
+
 	struct FunctionsScopePerFile
 	{
 		FunctionsScopeVec m_FunctionsScope;
@@ -87,6 +89,10 @@
         void OnGotoNextFunction(wxCommandEvent& event);
         void OnClassMethod(wxCommandEvent& event);
         void OnUnimplementedClassMethods(wxCommandEvent&
event);
+        //DeclTmp
+        void OnGotoImplDeclRecursive(wxCommandEvent& event);
+        void OnComefromImplDeclRecursive(wxCommandEvent&
event);
+
         void OnGotoDeclaration(wxCommandEvent& event);
         void OnOpenIncludeFile(wxCommandEvent& event);
         void OnAppDoneStartup(CodeBlocksEvent& event);
@@ -121,6 +127,8 @@
         wxString m_LastIncludeFileFrom;
         wxString m_LastIncludeFile;
         wxString m_LastKeyword;
+        list<wxString> m_listLastKeyword;
+        FunctionsScopeVec m_listLastPositions;
 
         wxMenu* m_EditMenu;
         wxMenu* m_SearchMenu;
@@ -148,7 +156,7 @@
         wxString m_LastFile;
 
         wxTimer m_FunctionsParsingTimer;
-        
+
         bool m_LexerKeywordsToInclude[9];
 
         DECLARE_EVENT_TABLE()
ollydbg 2009-06-09 16:16

Do you mean that you want to add a short-cut key to "Goto impl" instead of the context menu?

You can open a thread in the CB's forum, so that people can discuss this issue.