Browse Source

Implement function popup.

git-svn-id: file:///var/svn/tigccpp/trunk@698 9552661e-59e3-4036-b4f2-dbe53926924f
kevinkofler 18 years ago
parent
commit
8f889ca909
7 changed files with 80 additions and 15 deletions
  1. 5 3
      ktigcc/mainform.ui
  2. 33 2
      ktigcc/mainform.ui.h
  3. 7 2
      ktigcc/parsing.cpp
  4. 1 1
      ktigcc/parsing.h
  5. 3 0
      ktigcc/srcfile.h
  6. 4 2
      ktigcc/srcfilewin.ui
  7. 27 5
      ktigcc/srcfilewin.ui.h

+ 5 - 3
ktigcc/mainform.ui

@@ -1613,7 +1613,7 @@
     <slot>destroy()</slot>
     <slot>te_popup_aboutToShow()</slot>
     <slot>te_popup_activated( int index )</slot>
-    <slot>accel_activated( int index )</slot>
+    <slot>accel_activated(int)</slot>
     <slot>fileTreeAccel_activated( int index )</slot>
     <slot>fileNewProject()</slot>
     <slot>fileOpen()</slot>
@@ -1645,6 +1645,9 @@
     <slot>findReplace_replace( const QString &amp; text, int replacementIndex, int replacedLength, int matchedLength )</slot>
     <slot>findReplace_stop()</slot>
     <slot>findFunctions()</slot>
+    <slot>findFunctionsPopup_aboutToShow()</slot>
+    <slot>findFunctionsPopup_aboutToHide()</slot>
+    <slot>findFunctionsPopup_activated( int id )</slot>
     <slot>findOpenFileAtCursor()</slot>
     <slot>findFindSymbolDeclaration()</slot>
     <slot>projectAddFiles()</slot>
@@ -1691,8 +1694,7 @@
     <slot>clipboard_dataChanged()</slot>
     <slot>fileTreeItemRenamed( QListViewItem * item, const QString &amp; newName, int col )</slot>
     <slot>KDirWatch_dirty( const QString &amp; fileName )</slot>
-    <slot>findFunctionsPopup_activated(int id)</slot>
-    <slot>findFunctionsPopup_aboutToShow()</slot>
+    <slot>findFunctionsPopup_aboutToHide_async()</slot>
 </slots>
 <functions>
     <function specifier="static">deleteErrorsForLVFile( QListViewItem * item )</function>

+ 33 - 2
ktigcc/mainform.ui.h

@@ -95,6 +95,7 @@
 #include "programoutput.h"
 #include "tiemu.h"
 #include "callbacks.h"
+#include "parsing.h"
 
 using std::puts;
 using std::exit;
@@ -402,6 +403,7 @@ static KFindDialog *kfinddialog;
 static QListViewItem *findCurrentDocument;
 static unsigned findCurrentLine;
 QPtrList<SourceFile> sourceFiles;
+static QPopupMenu *findFunctionsPopup;
 
 class DnDListView : public KListView {
   private:
@@ -1119,9 +1121,11 @@ void MainForm::init()
   }
   QToolButton *findFunctionsButton=static_cast<QToolButton *>(toolBar
     ->child("findFunctionsAction_action_button","QToolButton",FALSE));
-  QPopupMenu *findFunctionsPopup=new QPopupMenu(findFunctionsButton);
+  findFunctionsPopup=new QPopupMenu(findFunctionsButton);
   connect(findFunctionsPopup,SIGNAL(aboutToShow()),
           this,SLOT(findFunctionsPopup_aboutToShow()));
+  connect(findFunctionsPopup,SIGNAL(aboutToHide()),
+          this,SLOT(findFunctionsPopup_aboutToHide()));
   connect(findFunctionsPopup,SIGNAL(activated(int)),
           this,SLOT(findFunctionsPopup_activated(int)));
   findFunctionsButton->setPopupDelay(0);
@@ -3036,6 +3040,8 @@ void MainForm::findReplace_stop()
   kreplace=static_cast<KReplaceWithSelection *>(NULL);
 }
 
+static SourceFileFunctions sourceFileFunctions;
+
 void MainForm::findFunctions()
 {
   
@@ -3043,12 +3049,37 @@ void MainForm::findFunctions()
 
 void MainForm::findFunctionsPopup_aboutToShow()
 {
+  findFunctionsPopup->clear();
+  if (CURRENT_VIEW) {
+    CATEGORY_OF(category,currentListItem);
+    sourceFileFunctions=getFunctions(CURRENT_VIEW->getDoc()->text(),
+      category==asmFilesListItem||category==sFilesListItem);
+    int idx=0;
+    for (SourceFileFunctions::Iterator it=sourceFileFunctions.begin();
+         it!=sourceFileFunctions.end(); ++it,++idx) {
+      findFunctionsPopup->insertItem((*it).name,idx);
+    }
+  }
+}
 
+void MainForm::findFunctionsPopup_aboutToHide()
+{
+  QTimer::singleShot(0,this,SLOT(findFunctionsPopup_aboutToHide_async()));
 }
 
-void MainForm::findFunctionsPopup_activated(int id)
+void MainForm::findFunctionsPopup_aboutToHide_async()
 {
+  findFunctionsPopup->clear();
+}
 
+void MainForm::findFunctionsPopup_activated(int id)
+{
+  if (CURRENT_VIEW) {
+    int line=sourceFileFunctions[id].implementationLine>=0
+             ?sourceFileFunctions[id].implementationLine
+             :sourceFileFunctions[id].prototypeLine;
+    CURRENT_VIEW->setCursorPositionReal(line,0);
+  }
 }
 
 void MainForm::findOpenFileAtCursor()

+ 7 - 2
ktigcc/parsing.cpp

@@ -25,6 +25,8 @@
 #include "ktigcc.h"
 #include <qstringlist.h>
 #include <qtextcodec.h>
+#include <qapplication.h>
+#include <qeventloop.h>
 #include <kprocio.h>
 #include <kmessagebox.h>
 #include <unistd.h>
@@ -73,11 +75,14 @@ SourceFileFunctions getCFunctions(const QString &text)
           else
             (*it).implementationLine=lineno;
         } else qWarning("Invalid result from ctags.");
-      } else usleep(1000);
+      } else {
+        usleep(10000);
+        QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput,10);
+      }
     }
   }
   delete_temp_file("parser_temp_source.c");
-  return SourceFileFunctions(); // Not implemented yet.
+  return result;
 }  
 
 SourceFileFunctions getASMFunctions(const QString &text)

+ 1 - 1
ktigcc/parsing.h

@@ -37,4 +37,4 @@ struct SourceFileFunction {
 typedef QValueList<SourceFileFunction> SourceFileFunctions;
 SourceFileFunctions getCFunctions(const QString &text);
 SourceFileFunctions getASMFunctions(const QString &text);
-#define getFunctions(text,isasm) (((isasm)?getCFunctions:getASMFunctions)((text)))
+#define getFunctions(text,isasm) (((isasm)?getASMFunctions:getCFunctions)((text)))

+ 3 - 0
ktigcc/srcfile.h

@@ -22,6 +22,7 @@
 
 #include "tpr.h"
 #include "srcfilewin.h"
+#include "parsing.h"
 
 #include <qstring.h>
 class MainForm;
@@ -67,4 +68,6 @@ struct SourceFile : public SourceFileWindow {
   KFindDialog *kfinddialog;
   unsigned findCurrentLine;
   KDirWatch *dirWatch;
+  QPopupMenu *findFunctionsPopup;
+  SourceFileFunctions sourceFileFunctions;
 };

+ 4 - 2
ktigcc/srcfilewin.ui

@@ -644,6 +644,9 @@
     <slot>findReplace_replace( const QString &amp; text, int replacementIndex, int replacedLength, int matchedLength )</slot>
     <slot>findReplace_stop()</slot>
     <slot>findFunctions()</slot>
+    <slot>findFunctionsPopup_aboutToShow()</slot>
+    <slot>findFunctionsPopup_aboutToHide()</slot>
+    <slot>findFunctionsPopup_activated( int id )</slot>
     <slot>findOpenFileAtCursor()</slot>
     <slot>findFindSymbolDeclaration()</slot>
     <slot>resizeEvent( QResizeEvent * event )</slot>
@@ -655,8 +658,7 @@
     <slot>current_view_charactersInteractivelyInserted( int line, int col, const QString &amp; characters )</slot>
     <slot>clipboard_dataChanged()</slot>
     <slot>KDirWatch_dirty( const QString &amp; fileName )</slot>
-    <slot>findFunctionsPopup_aboutToShow()</slot>
-    <slot>findFunctionsPopup_activated(int id)</slot>
+    <slot>findFunctionsPopup_aboutToHide_async()</slot>
 </slots>
 <functions>
     <function>initBase()</function>

+ 27 - 5
ktigcc/srcfilewin.ui.h

@@ -250,13 +250,15 @@ void SourceFileWindow::initBase()
   }
   QToolButton *findFunctionsButton=static_cast<QToolButton *>(toolBar
     ->child("findFunctionsAction_action_button","QToolButton",FALSE));
-  QPopupMenu *findFunctionsPopup=new QPopupMenu(findFunctionsButton);
-  connect(findFunctionsPopup,SIGNAL(aboutToShow()),
+  THIS->findFunctionsPopup=new QPopupMenu(findFunctionsButton);
+  connect(THIS->findFunctionsPopup,SIGNAL(aboutToShow()),
           this,SLOT(findFunctionsPopup_aboutToShow()));
-  connect(findFunctionsPopup,SIGNAL(activated(int)),
+  connect(THIS->findFunctionsPopup,SIGNAL(aboutToHide()),
+          this,SLOT(findFunctionsPopup_aboutToHide()));
+  connect(THIS->findFunctionsPopup,SIGNAL(activated(int)),
           this,SLOT(findFunctionsPopup_activated(int)));
   findFunctionsButton->setPopupDelay(0);
-  findFunctionsButton->setPopup(findFunctionsPopup);
+  findFunctionsButton->setPopup(THIS->findFunctionsPopup);
   if (THIS->isTextFile) findFunctionsAction->setEnabled(FALSE);
 }
 
@@ -943,12 +945,32 @@ void SourceFileWindow::findFunctions()
 
 void SourceFileWindow::findFunctionsPopup_aboutToShow()
 {
+  THIS->findFunctionsPopup->clear();
+  THIS->sourceFileFunctions=getFunctions(CURRENT_VIEW->getDoc()->text(),
+                                         THIS->isASMFile);
+  int idx=0;
+  for (SourceFileFunctions::Iterator it=THIS->sourceFileFunctions.begin();
+       it!=THIS->sourceFileFunctions.end(); ++it,++idx) {
+    THIS->findFunctionsPopup->insertItem((*it).name,idx);
+  }
+}
 
+void SourceFileWindow::findFunctionsPopup_aboutToHide()
+{
+  QTimer::singleShot(0,this,SLOT(findFunctionsPopup_aboutToHide_async()));
 }
 
-void SourceFileWindow::findFunctionsPopup_activated(int id)
+void SourceFileWindow::findFunctionsPopup_aboutToHide_async()
 {
+  THIS->findFunctionsPopup->clear();
+}
 
+void SourceFileWindow::findFunctionsPopup_activated(int id)
+{
+  int line=THIS->sourceFileFunctions[id].implementationLine>=0
+           ?THIS->sourceFileFunctions[id].implementationLine
+           :THIS->sourceFileFunctions[id].prototypeLine;
+  CURRENT_VIEW->setCursorPositionReal(line,0);
 }
 
 void SourceFileWindow::findOpenFileAtCursor()