-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I've run into an extremely bizarre bug.  Maybe someone out there can help
me track it down.  

The attached patch is an updated version of Joaquin's Goto patch.  It
should apply properly against current trees.  If you compile it normally,
it will run just fine, and demonstrate Joaquin's quality dialog.  However,
if you compile it into a debug build, then on startup, you get a segfault,
because a pure virtual function gets called (always bad).  The stack trace
looks like this:  

gdb) bt
#0  0x402e64e1 in __kill () from /lib/libc.so.6
#1  0x402e6156 in raise (sig=6) at ../sysdeps/posix/raise.c:27
#2  0x402e7868 in abort () at ../sysdeps/generic/abort.c:88
#3  0x81c7bf8 in __terminate ()
#4  0x81c7c15 in __terminate ()
#5  0x81c879b in __pure_virtual ()
#6  0x80d7e20 in AP_Prefs::overlaySystemPrefs (this=0x8328bb0) at
ap_Prefs.cpp:131
#7  0x80d7d61 in AP_Prefs::loadBuiltinPrefs (this=0x8328bb0) at
ap_Prefs.cpp:118
#8  0x80d7be0 in AP_Prefs::fullInit (this=0x8328bb0) at ap_Prefs.cpp:62
#9  0x80a4aa7 in AP_UnixApp::initialize (this=0x8328550) at
ap_UnixApp.cpp:127
#10 0x80a6b97 in AP_UnixApp::main (szAppName=0x81d0408 "AbiWord Personal",
argc=1, argv=0xbffffb14)
    at ap_UnixApp.cpp:833
#11 0x809538b in main (argc=1, argv=0xbffffb14) at UnixMain.cpp:24
#12 0x402e01eb in __libc_start_main (main=0x8095370 <main>, argc=1,
argv=0xbffffb14, 
    init=0x8093704 <_init>, fini=0x81d03e0 <_fini>, rtld_fini=0x4000a610
<_dl_fini>, 
    stack_end=0xbffffb0c) at ../sysdeps/generic/libc-start.c:90

What has happend is that in frame #6 (the last one in our code) we have
this line.  

131 const char * szSystemDefaultPrefsDir = m_pApp->getAbiSuiteAppDir();

Now m_pApp should be of type AP_UnixApp.  But gdb tells me the following:

(gdb) ptype m_pApp
type = class XAP_App {

And, of course, getAbiSuiteAppDir() is pure virtual for XAP_App.  So
somewhere, the real type got sliced off.  

It turns out the this slicing happens when AP_UnixApp::initialize calls
m_prefs->fullInit().  If you step through the program, before line 127, if
you execute 
        m_prefs.m_pApp->getAbiSuiteAppDir()

you get the right answer ("/usr/local/AbiSuite/AbiWord").  

Once you step into line 127, the following call should be equivalent:
        *this).m_pApp->getAbiSuiteAppDir()

But instead of the same answer, you get a SIGABRT.  bad.  

I have no idea why this simple change would make such a difference.  

Now, I would like to be able to step through the non-debug build to see
what is happening.  But that's the trouble with problems that only show up
in debug - you can't compare them.  

To further confuse you, the debug nature of the build should have no
effect.  I grepped through the differences between the tree with problems,
and the current CVS tree, and the only time debug appeared was in
UT_DEBUGMSG.  Therefore, the debug and normal builds should behave
identically.  But, of course, they don't.

Well, if you're still reading, I'm impressed.

Nobody ever said I wasn't thorough. 

If you have *any* idea what is going on here, please help.  
           
                                sam th               
                                [EMAIL PROTECTED]
                                http://sam.rh.uchicago.edu                             
         

PS - I love GDB.  
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.1 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE5Njcft+kM0Mq9M/wRAgwyAKDRg/R7qpHehJtI7QQhd3UMtIrbCgCfV0TS
M23kFFD8HiZTUYQhjSCLZRE=
=Hj6V
-----END PGP SIGNATURE-----
Only in abigoto/src: Linux_2.3.36_i386_DBG
diff -u -r -x CVS abicommit/src/af/xap/Makefile abigoto/src/af/xap/Makefile
--- abicommit/src/af/xap/Makefile       Sun May 28 22:22:09 2000
+++ abigoto/src/af/xap/Makefile Thu Jun  1 00:56:53 2000
@@ -47,9 +47,10 @@
 
 # THESE ARE OBJECTS EXCLUSIVE TO THE UNIX FRONT-END
 ifeq ($(ABI_FE), Unix)
-PLATFORM_OBJS +=       $(OBJDIR)/xap_$(ABI_FE)Font.$(OBJ_SUFFIX)                      
 \
-                       $(OBJDIR)/xap_$(ABI_FE)FontManager.$(OBJ_SUFFIX)               
 \
+PLATFORM_OBJS +=       $(OBJDIR)/xap_$(ABI_FE)Font.$(OBJ_SUFFIX)               \
+                       $(OBJDIR)/xap_$(ABI_FE)FontManager.$(OBJ_SUFFIX)        \
                        $(OBJDIR)/xap_$(ABI_FE)FontXLFD.$(OBJ_SUFFIX)           \
+                       $(OBJDIR)/xap_$(ABI_FE)GtkTricks.$(OBJ_SUFFIX)          \
                        $(OBJDIR)/xap_$(ABI_FE)PSFont.$(OBJ_SUFFIX)             \
                        $(OBJDIR)/xap_$(ABI_FE)PSGenerate.$(OBJ_SUFFIX)         \
                        $(OBJDIR)/xap_$(ABI_FE)PSParseAFM.$(OBJ_SUFFIX)         \
@@ -58,7 +59,7 @@
 endif
 
 ifeq ($(ABI_FE), Win32)
-PLATFORM_OBJS +=       $(OBJDIR)/xap_$(ABI_FE)Slurp.$(OBJ_SUFFIX)                     
 \
+PLATFORM_OBJS +=       $(OBJDIR)/xap_$(ABI_FE)Slurp.$(OBJ_SUFFIX)              \
                        $(OBJDIR)/xap_$(ABI_FE)PreviewWidget.$(OBJ_SUFFIX)
 endif
 
@@ -74,17 +75,17 @@
 
 OBJS=          $(PLATFORM_OBJS)                                                \
                $(OBJDIR)/xad_Document.$(OBJ_SUFFIX)                            \
-               $(OBJDIR)/xap_App.$(OBJ_SUFFIX)                         \
+               $(OBJDIR)/xap_App.$(OBJ_SUFFIX)                                 \
                $(OBJDIR)/xap_Args.$(OBJ_SUFFIX)                                \
-               $(OBJDIR)/xap_Clipboard.$(OBJ_SUFFIX)                   \
+               $(OBJDIR)/xap_Clipboard.$(OBJ_SUFFIX)                           \
                $(OBJDIR)/xap_Dialog.$(OBJ_SUFFIX)                              \
                $(OBJDIR)/xap_DialogFactory.$(OBJ_SUFFIX)                       \
-               $(OBJDIR)/xap_Dictionary.$(OBJ_SUFFIX)                  \
-               $(OBJDIR)/xap_Dlg_About.$(OBJ_SUFFIX)                   \
-               $(OBJDIR)/xap_Dlg_FileOpenSaveAs.$(OBJ_SUFFIX)          \
+               $(OBJDIR)/xap_Dictionary.$(OBJ_SUFFIX)                          \
+               $(OBJDIR)/xap_Dlg_About.$(OBJ_SUFFIX)                           \
+               $(OBJDIR)/xap_Dlg_FileOpenSaveAs.$(OBJ_SUFFIX)                  \
                $(OBJDIR)/xap_Dlg_FontChooser.$(OBJ_SUFFIX)                     \
                $(OBJDIR)/xap_Dlg_MessageBox.$(OBJ_SUFFIX)                      \
-               $(OBJDIR)/xap_Dlg_Print.$(OBJ_SUFFIX)                   \
+               $(OBJDIR)/xap_Dlg_Print.$(OBJ_SUFFIX)                           \
                $(OBJDIR)/xap_Dlg_WindowMore.$(OBJ_SUFFIX)                      \
                $(OBJDIR)/xap_Dlg_Zoom.$(OBJ_SUFFIX)                            \
                $(OBJDIR)/xap_Dlg_Insert_Symbol.$(OBJ_SUFFIX)                          
 \
diff -u -r -x CVS abicommit/src/af/xap/unix/Makefile abigoto/src/af/xap/unix/Makefile
--- abicommit/src/af/xap/unix/Makefile  Wed Apr 26 15:07:23 2000
+++ abigoto/src/af/xap/unix/Makefile    Thu Jun  1 00:56:53 2000
@@ -40,6 +40,7 @@
                        xap_UnixFont.cpp                        \
                        xap_UnixFontManager.cpp                 \
                        xap_UnixFrame.cpp                       \
+                       xap_UnixGtkTricks.cpp                   \
                        xap_UnixToolbar_Icons.cpp               \
                        xap_UnixPSFont.cpp                      \
                        xap_UnixPSGenerate.cpp                  \
Only in abigoto/src/af/xap/unix: xap_UnixGtkTricks.cpp
Only in abigoto/src/af/xap/unix: xap_UnixGtkTricks.h
diff -u -r -x CVS abicommit/src/text/fmt/xp/fp_Line.cpp 
abigoto/src/text/fmt/xp/fp_Line.cpp
--- abicommit/src/text/fmt/xp/fp_Line.cpp       Thu May 11 16:33:15 2000
+++ abigoto/src/text/fmt/xp/fp_Line.cpp Thu Jun  1 01:57:28 2000
@@ -948,11 +948,11 @@
 
 UT_Bool        fp_Line::containsForcedColumnBreak(void) const
 {
-       if (!isEmpty())
+       if(!isEmpty())
        {
                fp_Run* pRun = getLastRun();
                if (pRun->getType() == FPRUN_FORCEDCOLUMNBREAK)
-               {
+               {                       
                        return UT_TRUE;
                }
        }
@@ -1295,4 +1295,5 @@
 
 
 }
+
 
diff -u -r -x CVS abicommit/src/text/fmt/xp/fv_View.cpp 
abigoto/src/text/fmt/xp/fv_View.cpp
--- abicommit/src/text/fmt/xp/fv_View.cpp       Thu Jun  1 02:06:57 2000
+++ abigoto/src/text/fmt/xp/fv_View.cpp Thu Jun  1 00:56:55 2000
@@ -1029,14 +1029,14 @@
        {
                PT_DocPosition iPoint1 = getPoint();
                if ( iPoint1 == iPoint )
-                 {
+               {
                    if(!_charMotion(bForward, count))   
-                     {
-                       _setPoint(iPoint);
-                       notifyListeners(AV_CHG_MOTION);
-                       return;
-                     }
-                 }
+                       {
+                               _setPoint(iPoint);
+                               notifyListeners(AV_CHG_MOTION);
+                               return;
+                       }
+               }
                _updateInsertionPoint();
        }
        notifyListeners(AV_CHG_MOTION);
@@ -2273,6 +2273,25 @@
        UT_sint32 yPoint;
        UT_sint32 iPointHeight;
 
+
+       fp_Page* pOldPage = _getCurrentPage();
+
+       // try to locate next/prev page
+       fp_Page* pPage = (bNext ? pOldPage->getNext() : pOldPage->getPrev());
+
+       // if couldn't move, go to top of this page instead
+       if (!pPage) 
+               pPage = pOldPage;
+
+       _moveInsPtToPage(pPage);
+}
+
+fp_Page *FV_View::_getCurrentPage(void)
+{
+       UT_sint32 xPoint;
+       UT_sint32 yPoint;
+       UT_sint32 iPointHeight;
+
        /*
                This function moves the IP to the beginning of the previous or 
                next page (ie not this one).
@@ -2287,20 +2306,33 @@
        fp_Container* pOldContainer = pOldLine->getContainer();
        fp_Page* pOldPage = pOldContainer->getPage();
 
-       // try to locate next/prev page
-       fp_Page* pPage = (bNext ? pOldPage->getNext() : pOldPage->getPrev());
+       return pOldPage;
+}
 
-       // if couldn't move, go to top of this page instead
-       if (!pPage) 
-               pPage = pOldPage;
+void FV_View::_moveInsPtNthPage(UT_uint32 n)
+{
+       fp_Page *page = m_pLayout->getFirstPage();
+
+       if (n > m_pLayout->countPages ())
+               n = m_pLayout->countPages ();
+
+       for (UT_uint32 i = 1; i < n; i++)
+       {
+               page = page->getNext ();
+       }
+
+       _moveInsPtToPage(page);
+}
 
+void FV_View::_moveInsPtToPage(fp_Page *page)
+{
        // move to the first pos on this page
-       PT_DocPosition iNewPoint = pPage->getFirstLastPos(UT_TRUE);
+       PT_DocPosition iNewPoint = page->getFirstLastPos(UT_TRUE);
        _setPoint(iNewPoint, UT_FALSE);
 
        // explicit vertical scroll to top of page
        UT_sint32 iPageOffset;
-       getPageYOffset(pPage, iPageOffset);
+       getPageYOffset(page, iPageOffset);
 
        iPageOffset -= fl_PAGEVIEW_PAGE_SEP /2;
        iPageOffset -= m_yScrollOffset;
@@ -2308,7 +2340,7 @@
        UT_Bool bVScroll = UT_FALSE;
        if (iPageOffset < 0)
        {
-               cmdScroll(AV_SCROLLCMD_LINEUP, (UT_uint32) (-(iPageOffset)));
+               cmdScroll(AV_SCROLLCMD_LINEUP, (UT_uint32) (-iPageOffset));
                bVScroll = UT_TRUE;
        }
        else if (iPageOffset > 0)
@@ -2735,34 +2767,150 @@
 
 // ---------------- start goto ---------------
 
-UT_Bool FV_View::gotoTarget(FV_JumpTarget /* type */, UT_UCSChar * /* data */)
+UT_Bool FV_View::gotoTarget(AP_JumpTarget type, UT_UCSChar *data)
 {
-       UT_ASSERT(UT_NOT_IMPLEMENTED);
-
        UT_ASSERT(m_pLayout);
+       UT_Bool inc = UT_FALSE;
+       UT_Bool dec = UT_FALSE;
+       PT_DocPosition   offset = 0;
 
-       // TODO:  We need a Unicode atol/strtol.
-
-       /*
-       char * numberString = (char *) calloc(UT_UCS_strlen(m_targetData) + 1, 
sizeof(char));
+       char * numberString = (char *) calloc(UT_UCS_strlen(data) + 1, sizeof(char));
        UT_ASSERT(numberString);
        
-       UT_UCS_strcpy_to_char(numberString, m_targetData);
-       
-       UT_uint32 pageNumber = atol(numberString);
+       UT_UCS_strcpy_to_char(numberString, data);
+
+       switch (numberString[0])
+       {
+       case '+':
+               inc = UT_TRUE;
+               numberString++;
+               break;
+       case '-':
+               dec = UT_TRUE;
+               numberString++;
+               break;
+       }
+
+       UT_uint32 number = atol(numberString);
+
+       if (dec || inc)
+               numberString--;
        FREEP(numberString);
-       */
 
        // check for range
-//     if (pageNumber < 0 || pageNumber > (UT_uint32) m_pLayout->countPages())
-//             return UT_FALSE;
+       //      if (number < 0 || number > (UT_uint32) m_pLayout->countPages())
+       //              return UT_FALSE;
 
-       // get the right page
-//     fp_Page * page = m_pLayout->getNthPage(pageNumber);
-//     UT_ASSERT(page);
+       offset = _findGetCurrentOffset ();
+       
+       switch (type)
+       {
+       case AP_JUMPTARGET_PAGE:
+       {
+               if (!inc && !dec)
+                       _moveInsPtNthPage (number);
+               else
+               {
+                       fp_Page* pOldPage = _getCurrentPage();
+                       fp_Page* pPage;
+
+                       if (inc) // TODO:  What if number passes the number of pages?
+                               for (UT_uint32 i = 0; i < number; i++)
+                                       pPage = pOldPage->getNext();
+                       else
+                               for (UT_uint32 i = 0; i < number; i++)
+                                       pPage = pOldPage->getPrev();
+
+                       if (!pPage) 
+                               pPage = pOldPage;
+
+                       _moveInsPtToPage(pPage);
+               }
+
+               break;
+       }
+       case AP_JUMPTARGET_LINE:
+               if (inc || dec)
+               {
+                       UT_Bool bNext;
+
+                       if (inc)
+                               bNext = UT_TRUE;
+                       else
+                               bNext = UT_FALSE;
+
+                       for (UT_uint32 i = 0; i < number; i++)
+                               _moveInsPtNextPrevLine (bNext);  // HACK: A like the 
+quick hacks... :)
+               }
+               else
+               {
+                       UT_uint32 line = 0;
+                       UT_sint32 tmpx, tmpy;
+                       fp_Line *pLine;
+                       fp_Line *pOldLine;
+                       
+                       fl_SectionLayout * pSL = m_pLayout->getFirstSection();
+                       fl_BlockLayout * pBL = pSL->getFirstBlock();
+                       pLine = pBL->getFirstLine();
+                       
+                       for (UT_uint32 i = 1; i < number; i++)
+                       {
+                               pOldLine = pLine;
+                               
+                               if ((pLine = pLine->getNext ()) == NULL)
+                               {
+                                       if ((pBL = pBL->getNext ()) == NULL)
+                                       {
+                                               if ((pSL = pSL->getNext ()) == NULL)
+                                               {
+                                                       pLine = pOldLine;
+                                                       break;
+                                               }
+                                               else
+                                                       pBL = pSL->getFirstBlock ();
+                                       }
+                                       else
+                                               pLine = pBL->getFirstLine ();
+                               }
+                       }
+               
+                       UT_sint32 iPageOffset;
+                       fp_Container* pOldContainer = pLine->getContainer();
+                       pOldContainer->getOffsets(pLine, tmpx, tmpy);
+
+                       fp_Page* pOldPage = pOldContainer->getPage();
+                       getPageYOffset(pOldPage, iPageOffset);
+                       tmpy += iPageOffset - m_yScrollOffset;
+               
+                       UT_sint32 xClick, yClick;
+                       PT_DocPosition iNewPoint;
+                       UT_Bool bBOL, bEOL;
+                       fp_Page* pPage = _getPageForXY(tmpx, tmpy, xClick, yClick);
+                       pPage->mapXYToPosition(xClick, yClick, iNewPoint, bBOL, bEOL);
+               
+                       _setPoint(iNewPoint, bEOL);
+               }
+               break;
+       case AP_JUMPTARGET_PICTURE:
+               // TODO
+               break;
+       default:
+               // TODO
+               ;
+       }
 
-       // peek inside the page
-       // ...
+       if (isSelectionEmpty())
+       {
+               if (!_ensureThatInsertionPointIsOnScreen())
+               {
+                       _fixInsertionPointCoords();
+                       _drawInsertionPoint();
+               }
+       }
+       else
+       {
+               _ensureThatInsertionPointIsOnScreen();
+       }
 
        return UT_FALSE;
 }
diff -u -r -x CVS abicommit/src/text/fmt/xp/fv_View.h 
abigoto/src/text/fmt/xp/fv_View.h
--- abicommit/src/text/fmt/xp/fv_View.h Sun May 28 22:22:09 2000
+++ abigoto/src/text/fmt/xp/fv_View.h   Thu Jun  1 01:01:04 2000
@@ -27,6 +27,10 @@
 #include "xav_View.h"
 #include "pt_Types.h"
 #include "gr_DrawArgs.h"
+#include "ev_EditBits.h"
+#include "ie_types.h"
+#include "xap_Prefs.h"
+#include "ap_Dialog_Goto.h"
 
 // number of milliseconds between cursor blinks
 const int AUTO_DRAW_POINT = 600;
@@ -58,12 +62,6 @@
        FV_DOCPOS_BOW, FV_DOCPOS_EOW_MOVE, FV_DOCPOS_EOW_SELECT // word
 } FV_DocPos;
 
-typedef enum _FVJumpTarget
-{
-       FV_JUMPTARGET_PAGE,                             // beginning of page
-       FV_JUMPTARGET_LINE                              // beginning of line
-} FV_JumpTarget;
-               
 struct fv_ChangeState
 {
        UT_Bool                         bUndo;
@@ -198,8 +196,7 @@
        
 // ----------------------
 
-       // goto -- this is really not implemented
-       UT_Bool                 gotoTarget(FV_JumpTarget type, UT_UCSChar * data);
+       UT_Bool                 gotoTarget(AP_JumpTarget type, UT_UCSChar * data);
 
        void                    changeNumColumns(UT_uint32 iNumColumns);
        
@@ -249,6 +246,9 @@
        UT_Bool                         _ensureThatInsertionPointIsOnScreen(void);
        void                        _moveInsPtNextPrevPage(UT_Bool bNext);
        void                        _moveInsPtNextPrevLine(UT_Bool bNext);
+       fp_Page *           _getCurrentPage(void);
+       void                _moveInsPtNthPage(UT_uint32 n);
+       void                _moveInsPtToPage(fp_Page *page);
 
        PT_DocPosition          _getDocPosFromPoint(PT_DocPosition iPoint, FV_DocPos 
dp, UT_Bool bKeepLooking=UT_TRUE);
        PT_DocPosition          _getDocPos(FV_DocPos dp, UT_Bool 
bKeepLooking=UT_TRUE);
diff -u -r -x CVS abicommit/src/wp/ap/Makefile abigoto/src/wp/ap/Makefile
--- abicommit/src/wp/ap/Makefile        Sun May 28 22:22:10 2000
+++ abigoto/src/wp/ap/Makefile  Thu Jun  1 00:56:55 2000
@@ -32,6 +32,7 @@
                $(OBJDIR)/ap_$(ABI_FE)Dialog_Break.$(OBJ_SUFFIX)        \
                $(OBJDIR)/ap_$(ABI_FE)Dialog_WordCount.$(OBJ_SUFFIX)    \
                $(OBJDIR)/ap_$(ABI_FE)Dialog_Field.$(OBJ_SUFFIX)        \
+               $(OBJDIR)/ap_$(ABI_FE)Dialog_Goto.$(OBJ_SUFFIX)         \
                $(OBJDIR)/ap_$(ABI_FE)Dialog_Insert_DateTime.$(OBJ_SUFFIX)      \
                $(OBJDIR)/ap_$(ABI_FE)Dialog_Options.$(OBJ_SUFFIX)      \
                $(OBJDIR)/ap_$(ABI_FE)Dialog_Paragraph.$(OBJ_SUFFIX)    \
@@ -68,6 +69,7 @@
                $(OBJDIR)/ap_Dialog_Break.$(OBJ_SUFFIX)         \
                $(OBJDIR)/ap_Dialog_WordCount.$(OBJ_SUFFIX)     \
                $(OBJDIR)/ap_Dialog_Field.$(OBJ_SUFFIX)         \
+               $(OBJDIR)/ap_Dialog_Goto.$(OBJ_SUFFIX)          \
                $(OBJDIR)/ap_Dialog_Insert_DateTime.$(OBJ_SUFFIX)               \
                $(OBJDIR)/ap_Dialog_Options.$(OBJ_SUFFIX)       \
                $(OBJDIR)/ap_Dialog_Paragraph.$(OBJ_SUFFIX)     \
diff -u -r -x CVS abicommit/src/wp/ap/unix/Makefile abigoto/src/wp/ap/unix/Makefile
--- abicommit/src/wp/ap/unix/Makefile   Wed Apr 26 15:07:23 2000
+++ abigoto/src/wp/ap/unix/Makefile     Thu Jun  1 00:56:55 2000
@@ -33,6 +33,7 @@
                        ap_$(ABI_FE)DialogFactory.cpp           \
                        ap_$(ABI_FE)Dialog_Break.cpp            \
                        ap_$(ABI_FE)Dialog_Field.cpp            \
+                       ap_$(ABI_FE)Dialog_Goto.cpp             \
                        ap_$(ABI_FE)Dialog_Insert_DateTime.cpp  \
                        ap_$(ABI_FE)Dialog_Options.cpp          \
                        ap_$(ABI_FE)Dialog_Paragraph.cpp        \
diff -u -r -x CVS abicommit/src/wp/ap/unix/ap_UnixDialog_All.h 
abigoto/src/wp/ap/unix/ap_UnixDialog_All.h
--- abicommit/src/wp/ap/unix/ap_UnixDialog_All.h        Sun May 28 22:22:10 2000
+++ abigoto/src/wp/ap/unix/ap_UnixDialog_All.h  Thu Jun  1 01:07:35 2000
@@ -45,6 +45,7 @@
 
 #      include "ap_UnixDialog_Replace.h"
 #      include "ap_UnixDialog_Break.h"
+#      include "ap_UnixDialog_Goto.h"
 #      include "ap_UnixDialog_Paragraph.h"
 #      include "ap_UnixDialog_Options.h"
 #      include "ap_UnixDialog_Spell.h"
@@ -86,6 +87,7 @@
 
        DeclareDialog(AP_DIALOG_ID_REPLACE,                     
AP_UnixGnomeDialog_Replace)
        DeclareDialog(AP_DIALOG_ID_FIND,                        
AP_UnixGnomeDialog_Replace)
+       DeclareDialog(AP_DIALOG_ID_GOTO,                        AP_UnixDialog_Goto)
        DeclareDialog(AP_DIALOG_ID_BREAK,                       
AP_UnixGnomeDialog_Break)
        DeclareDialog(AP_DIALOG_ID_SPELL,                       AP_UnixDialog_Spell)
        DeclareDialog(AP_DIALOG_ID_PARAGRAPH,           AP_UnixGnomeDialog_Paragraph)  
 
@@ -110,6 +112,7 @@
 
        DeclareDialog(AP_DIALOG_ID_REPLACE,                     AP_UnixDialog_Replace)
        DeclareDialog(AP_DIALOG_ID_FIND,                        AP_UnixDialog_Replace)
+       DeclareDialog(AP_DIALOG_ID_GOTO,                        AP_UnixDialog_Goto)
        DeclareDialog(AP_DIALOG_ID_BREAK,                       AP_UnixDialog_Break)
        DeclareDialog(AP_DIALOG_ID_SPELL,                       AP_UnixDialog_Spell)
        DeclareDialog(AP_DIALOG_ID_PARAGRAPH,           AP_UnixDialog_Paragraph)       
 
diff -u -r -x CVS abicommit/src/wp/ap/unix/ap_UnixDialog_Goto.cpp 
abigoto/src/wp/ap/unix/ap_UnixDialog_Goto.cpp
--- abicommit/src/wp/ap/unix/ap_UnixDialog_Goto.cpp     Thu May 11 16:33:15 2000
+++ abigoto/src/wp/ap/unix/ap_UnixDialog_Goto.cpp       Thu Jun  1 01:09:40 2000
@@ -28,11 +28,14 @@
 #include "xap_Dialog_Id.h"
 #include "xap_UnixApp.h"
 #include "xap_UnixFrame.h"
+#include "xap_UnixGtkTricks.h"
 
 #include "ap_Dialog_Id.h"
 #include "ap_Dialog_Goto.h"
 #include "ap_UnixDialog_Goto.h"
 
+#include "fv_View.h"
+
 /*****************************************************************/
 XAP_Dialog * AP_UnixDialog_Goto::static_constructor(XAP_DialogFactory * pFactory,
                                                                                       
            XAP_Dialog_Id id)
@@ -45,268 +48,293 @@
                                                                           
XAP_Dialog_Id id)
        : AP_Dialog_Goto(pDlgFactory,id)
 {
-
-       m_gotoString = NULL;
-       m_replaceString = NULL;
-    m_matchCase = UT_TRUE;
 }
 
 AP_UnixDialog_Goto::~AP_UnixDialog_Goto(void)
 {
 }
 
-static void s_gotoCallback(GtkWidget * widget, AP_UnixDialog_Goto * repDialog)
+static void s_goto(const char *number, AP_UnixDialog_Goto * me)
 {
-       UT_ASSERT(widget);
-       UT_ASSERT(repDialog);
+       UT_UCSChar *ucsnumber = (UT_UCSChar *) malloc (sizeof (UT_UCSChar) * 
+(strlen(number) + 1));
+       UT_UCS_strcpy_char (ucsnumber, number);
+       FV_View *view;
+       int target = me->getSelectedRow ();
+       
+       UT_ASSERT(view = me->getView ());
 
-       char * findEntryText;
+       view->gotoTarget ((AP_JumpTarget) target, ucsnumber);
+       free (ucsnumber);
+}
 
-       findEntryText = (char *) gtk_entry_get_text(GTK_ENTRY(repDialog->findEntry));
-       
-       UT_DEBUGMSG(("Find entry contents: \"%s\"\n", ((findEntryText) ? findEntryText 
: "NULL")));
+static void s_gotoClicked(GtkWidget * widget, AP_UnixDialog_Goto * me)
+{
+       GtkWidget *mw = me->m_wMainWindow;
+       GtkWidget *table = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (mw), 
+"table"));
+       GtkWidget *entry = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (table), 
+"entry1"));
+       char *number = gtk_entry_get_text (GTK_ENTRY (entry));
 
-       UT_UCSChar * findString;
+       s_goto ((const char *) number, me);
+}
 
-       UT_UCS_cloneString_char(&findString, findEntryText);
-       
-       repDialog->setFindString(findString);
-       
-       repDialog->findNext();
+static void s_nextClicked(GtkWidget * widget, AP_UnixDialog_Goto * me)
+{
+       s_goto ("+1", me);
+}
 
-       FREEP(findString);
+static void s_prevClicked(GtkWidget * widget, AP_UnixDialog_Goto * me)
+{
+       s_goto ("-1", me);
 }
 
-static void s_closeCallback(GtkWidget * object, GtkWidget * data)
+static void s_closeClicked(GtkWidget * object, GtkWidget * data)
 {
        UT_ASSERT(object);
        gtk_main_quit();
 }
 
-static void s_delete_clicked(GtkWidget * widget, gpointer data, gpointer extra)
+static void s_deleteClicked(GtkWidget * widget, gpointer data)
 {
-       // just quit out of the dialog
+//     AP_UnixDialog_Goto *dlg = (AP_UnixDialog_Goto *) data;
+//     UT_ASSERT(dlg);
+//     dlg->event_WindowDelete();
        gtk_main_quit();
 }
 
-void AP_UnixDialog_Goto::runModeless(XAP_Frame * pFrame)
+void AP_UnixDialog_Goto::s_targetChanged(GtkWidget *clist, gint row, gint column,
+                                                                                
+GdkEventButton *event, AP_UnixDialog_Goto *me)
 {
-       GtkWidget * topLevel;
-       GtkWidget * vbox;
-       
-       GtkWidget * targetList;
-       GtkWidget * findLabel;
-       GtkWidget * toggleBox;
-       GtkWidget * replaceBox;
-       GtkWidget * replaceLabel;
-       GtkWidget * separator;
-       GtkWidget * buttonBox;
-       GtkWidget * findButton;
-       GtkWidget * replaceButton;
-       GtkWidget * replaceAllButton;
-       GtkWidget * cancelButton;
-
-       // create a top level window, the actual dialog
-       topLevel = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-
-       connectFocus(GTK_WIDGET(topLevel),pFrame);
-       gtk_signal_connect_after(GTK_OBJECT(topLevel),
-                                                        "destroy",
-                                                        NULL,
-                                                        NULL);
-       gtk_signal_connect_after(GTK_OBJECT(topLevel),
-                                                        "delete_event",
-                                                        
GTK_SIGNAL_FUNC(s_delete_clicked),
-                                                        NULL);
+       me->setSelectedRow (row);
+}
 
-       // don't let user shrink or expand, but auto-size to
-       // contents initially
-    gtk_window_set_policy(GTK_WINDOW(topLevel),
-                                                 FALSE,
-                                                 FALSE,
-                                                 TRUE);
-
-       // create a vertical stacked box to put our widgets in
-       vbox = gtk_vbox_new(FALSE, 0);
-       gtk_container_add(GTK_CONTAINER(topLevel), vbox);
-       gtk_widget_show(vbox);
-
-       // create a container for the target list
-       findBox = gtk_hbox_new(FALSE, 0);
-       gtk_box_pack_start(GTK_BOX (vbox), findBox, TRUE, TRUE, 10);
-       gtk_widget_show(findBox);
-
-       findEntry = gtk_entry_new_with_max_length(50);
-       gtk_box_pack_end(GTK_BOX(findBox), findEntry, TRUE, TRUE, 10);
-       gtk_widget_show(findEntry);
-
-       gtk_signal_connect(GTK_OBJECT(findEntry),
-                                          "activate",
-                                          GTK_SIGNAL_FUNC(FindCallback),
-                                          this);
+static void s_dataChanged(GtkWidget *widget, gpointer data)
+{
+       GtkWidget *goto_bt = gtk_lookup_widget (widget, "goto_bt");
+       gchar *text = gtk_entry_get_text (GTK_ENTRY (widget));
 
-       // this dialog is persistent, so we set our text to what
-       // it was last time
+       if (text[0] == '\0')
        {
-               UT_UCSChar * bufferUnicode = getFindString();
-               char * bufferNormal = (char *) calloc(UT_UCS_strlen(bufferUnicode) + 
1, sizeof(char));
-               UT_UCS_strcpy_to_char(bufferNormal, bufferUnicode);
-               FREEP(bufferUnicode);
-               
-               gtk_entry_set_text(GTK_ENTRY(findEntry), bufferNormal);
-               gtk_entry_select_region(GTK_ENTRY(findEntry), 0, 
GTK_ENTRY(findEntry)->text_length);
-
-               FREEP(bufferNormal);
+               gtk_widget_set_sensitive (goto_bt, FALSE);
+               // TODO
        }
+       else
+       {
+               // TODO
+               gtk_widget_set_sensitive (goto_bt, TRUE);
+       }
+}
 
-       // create the find label
-       findLabel = gtk_label_new("Find: ");
-       gtk_label_set_justify(GTK_LABEL(findLabel), GTK_JUSTIFY_RIGHT);
-       gtk_widget_set_usize(findLabel, 150, 0);
-       gtk_box_pack_end(GTK_BOX(findBox), findLabel, TRUE, TRUE, 0);
-       gtk_widget_show(findLabel);
-
-       // create container for Match Case Toggle
-       toggleBox = gtk_hbox_new(FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(vbox), toggleBox, TRUE, TRUE, 5);
-       gtk_widget_show (toggleBox);
-
-       // optional toggle switch for case
-       matchCaseCheck = gtk_check_button_new_with_label("Match Case");
-       gtk_box_pack_end(GTK_BOX(toggleBox), matchCaseCheck, FALSE, TRUE, 0);
-       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matchCaseCheck), m_matchCase);
-       gtk_widget_show(matchCaseCheck);
-
-       // catch the toggled
-       gtk_signal_connect(GTK_OBJECT(matchCaseCheck),
-                                          "toggled",
-                                          GTK_SIGNAL_FUNC(MatchCaseCallback),
-                                          (gpointer) this);
+void AP_UnixDialog_Goto::setSelectedRow(int row)
+{
+       m_iRow = row;
+}
 
-       if (m_id == AP_DIALOG_ID_REPLACE)
-       {
-               // container for Replace text field
-               replaceBox = gtk_hbox_new(FALSE, 0);
-               gtk_box_pack_start(GTK_BOX(vbox), replaceBox, TRUE, TRUE, 5);
-               gtk_widget_show(replaceBox);
+int AP_UnixDialog_Goto::getSelectedRow(void)
+{
+       return (m_iRow);
+}
 
-               replaceEntry = gtk_entry_new_with_max_length(50);
-       
-               {
-                       UT_UCSChar * bufferUnicode = getReplaceString();
-                       char * bufferNormal = (char *) 
calloc(UT_UCS_strlen(bufferUnicode) + 1, sizeof(char));
-                       UT_UCS_strcpy_to_char(bufferNormal, bufferUnicode);
-                       FREEP(bufferUnicode);
-               
-                       gtk_entry_set_text(GTK_ENTRY(replaceEntry), bufferNormal);
-
-                       FREEP(bufferNormal);
-               }
-               
-               gtk_box_pack_end (GTK_BOX (replaceBox), replaceEntry, TRUE, TRUE, 10);
-               gtk_widget_show (replaceEntry);
-
-               gtk_signal_connect(GTK_OBJECT(replaceEntry),
-                                                  "activate",
-                                                  GTK_SIGNAL_FUNC(ReplaceCallback),
-                                                  this);
-       
-               replaceLabel = gtk_label_new("Replace With: ");
-               gtk_label_set_justify(GTK_LABEL(replaceLabel), GTK_JUSTIFY_RIGHT);
-               gtk_widget_set_usize(replaceLabel, 150, 0);
-               gtk_box_pack_end(GTK_BOX(replaceBox), replaceLabel, TRUE, TRUE, 0);
-               gtk_widget_show(replaceLabel);
-       }
-       
-       // pretty seperator for the action area
-       separator = gtk_hseparator_new();
-       gtk_box_pack_start(GTK_BOX(vbox), separator, FALSE, TRUE, 5);
-       gtk_widget_show(separator);
+void AP_UnixDialog_Goto::runModal(XAP_Frame * pFrame)
+{
+       m_wMainWindow = _constructWindow();
+       _populateWindowData();
+       gtk_grab_add(m_wMainWindow);
 
-       // container for buttons
-       buttonBox = gtk_hbox_new(FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(vbox), buttonBox, FALSE, TRUE, 5);
-       gtk_widget_show(buttonBox);
-
-       findButton = gtk_button_new_with_label("Find Next");
-       gtk_widget_set_usize(findButton, DEFAULT_BUTTON_WIDTH, 0);
-       gtk_box_pack_start(GTK_BOX(buttonBox), findButton, FALSE, FALSE, 0);
-       gtk_widget_show(findButton);
-
-       gtk_signal_connect(GTK_OBJECT(findButton),
-                                          "clicked",
-                                          GTK_SIGNAL_FUNC(FindCallback),
-                                          this);
-               
-       if (m_id == AP_DIALOG_ID_REPLACE)
-       {
-               replaceButton = gtk_button_new_with_label("Replace");
-               gtk_widget_set_usize(replaceButton, DEFAULT_BUTTON_WIDTH, 0);
-               gtk_box_pack_start(GTK_BOX(buttonBox), replaceButton, FALSE, FALSE, 
0);
-               gtk_widget_show(replaceButton);
-
-               gtk_signal_connect(GTK_OBJECT(replaceButton),
-                                                  "clicked",
-                                                  GTK_SIGNAL_FUNC(ReplaceCallback),
-                                                  this);
-
-               replaceAllButton = gtk_button_new_with_label("Replace All");
-               gtk_widget_set_usize(replaceAllButton, DEFAULT_BUTTON_WIDTH, 0);
-               gtk_box_pack_start(GTK_BOX(buttonBox), replaceAllButton, FALSE, FALSE, 
0);
-               gtk_widget_show(replaceAllButton);
-
-               gtk_signal_connect(GTK_OBJECT(replaceAllButton),
-                                                  "clicked",
-                                                  
GTK_SIGNAL_FUNC(ReplaceAllCallback),
-                                                  this);
-       }
-       
-       cancelButton = gtk_button_new_with_label("Cancel");
-       gtk_widget_set_usize(cancelButton, DEFAULT_BUTTON_WIDTH, 0);
-       gtk_box_pack_start(GTK_BOX(buttonBox), cancelButton, FALSE, FALSE, 0);
-       gtk_widget_show(cancelButton);
-
-       gtk_signal_connect_object(GTK_OBJECT(cancelButton),
-                                                         "clicked",
-                                                         
GTK_SIGNAL_FUNC(CancelCallback),
-                                                         GTK_OBJECT(topLevel));
+       gtk_main();
 
-       GTK_WIDGET_SET_FLAGS(findButton, GTK_CAN_DEFAULT);
+       gtk_widget_destroy(m_wMainWindow);
+}
 
-       if (m_id == AP_DIALOG_ID_REPLACE)
-       {
-               GTK_WIDGET_SET_FLAGS(replaceButton, GTK_CAN_DEFAULT);
-               GTK_WIDGET_SET_FLAGS(replaceAllButton, GTK_CAN_DEFAULT);
-       }
-       GTK_WIDGET_SET_FLAGS(cancelButton, GTK_CAN_DEFAULT);
-       
-       // get top level window and it's GtkWidget *
-       XAP_UnixFrame * frame = static_cast<XAP_UnixFrame *>(pFrame);
-       UT_ASSERT(frame);
-       GtkWidget * parent = frame->getTopLevelWindow();
-       UT_ASSERT(parent);
-       // center it
-    centerDialog(parent, topLevel);
-       gtk_window_set_transient_for(GTK_WINDOW(topLevel), GTK_WINDOW(parent));
+GtkWidget * AP_UnixDialog_Goto::_constructWindow(void)
+{
+       GtkWidget *window1;
+       GtkWidget *vbox1;
+       GtkWidget *hseparator1;
+       GtkWidget *hbuttonbox1;
+       GtkWidget *button4;
+       GtkWidget *button5;
+       GtkWidget *goto_bt;
+       GtkWidget *close_bt;
+       GtkWidget *contents;
+
+       window1 = gtk_window_new (GTK_WINDOW_DIALOG);
+       gtk_object_set_data (GTK_OBJECT (window1), "window1", window1);
+       gtk_window_set_title (GTK_WINDOW (window1), "Go To...");
+       gtk_signal_connect_after(GTK_OBJECT(window1),
+                                                        "destroy",
+                                                        
+GTK_SIGNAL_FUNC(s_deleteClicked),
+                                                        NULL);
+       gtk_signal_connect_after(GTK_OBJECT(window1),
+                                                        "delete_event",
+                                                        
+GTK_SIGNAL_FUNC(s_deleteClicked),
+                                                        NULL);
+    gtk_window_set_policy(GTK_WINDOW(window1), FALSE, FALSE, TRUE);
+
+       vbox1 = gtk_vbox_new (FALSE, 0);
+       gtk_widget_ref (vbox1);
+       gtk_object_set_data_full (GTK_OBJECT (window1), "vbox1", vbox1,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_widget_show (vbox1);
+       gtk_container_add (GTK_CONTAINER (window1), vbox1);
+
+       contents = _constructWindowContents ();
+       gtk_widget_ref (contents);
+       gtk_object_set_data_full (GTK_OBJECT (window1), "table", contents,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_box_pack_start (GTK_BOX (vbox1), contents, TRUE, TRUE, 0);
        
-       if (m_id == AP_DIALOG_ID_FIND)
-               gtk_widget_grab_default(findButton);
-       else
-               gtk_widget_grab_default(replaceButton);
+       // container for buttons
 
-       // Find entry should have focus, for immediate typing
-       gtk_widget_grab_focus(findEntry);
-       gtk_grab_add(topLevel);
+       hseparator1 = gtk_hseparator_new ();
+       gtk_widget_ref (hseparator1);
+       gtk_object_set_data_full (GTK_OBJECT (window1), "hseparator1", hseparator1,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_widget_show (hseparator1);
+       gtk_box_pack_start (GTK_BOX (vbox1), hseparator1, TRUE, TRUE, 0);
+
+       hbuttonbox1 = gtk_hbutton_box_new ();
+       gtk_widget_ref (hbuttonbox1);
+       gtk_object_set_data_full (GTK_OBJECT (window1), "hbuttonbox1", hbuttonbox1,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_widget_show (hbuttonbox1);
+       gtk_box_pack_start (GTK_BOX (vbox1), hbuttonbox1, TRUE, TRUE, 0);
+
+       button4 = gtk_button_new_with_label ("<< Prev");
+       gtk_widget_ref (button4);
+       gtk_object_set_data_full (GTK_OBJECT (window1), "button4", button4,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_widget_show (button4);
+       gtk_container_add (GTK_CONTAINER (hbuttonbox1), button4);
+       gtk_signal_connect (GTK_OBJECT (button4), "clicked",
+                                               GTK_SIGNAL_FUNC (s_prevClicked), 
+this);
+       GTK_WIDGET_SET_FLAGS (button4, GTK_CAN_DEFAULT);
+
+       button5 = gtk_button_new_with_label ("Next >>");
+       gtk_widget_ref (button5);
+       gtk_object_set_data_full (GTK_OBJECT (window1), "button5", button5,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_widget_show (button5);
+       gtk_container_add (GTK_CONTAINER (hbuttonbox1), button5);
+       gtk_signal_connect (GTK_OBJECT (button5), "clicked",
+                                               GTK_SIGNAL_FUNC (s_nextClicked), 
+this);
+       GTK_WIDGET_SET_FLAGS (button5, GTK_CAN_DEFAULT);
+
+       goto_bt = gtk_button_new_with_label ("Go To");
+       gtk_widget_ref (goto_bt);
+       gtk_object_set_data_full (GTK_OBJECT (window1), "goto_bt", goto_bt,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_widget_show (goto_bt);
+       gtk_signal_connect_after(GTK_OBJECT(goto_bt), "clicked",
+                                                        
+GTK_SIGNAL_FUNC(s_gotoClicked), this);
+       gtk_container_add (GTK_CONTAINER (hbuttonbox1), goto_bt);
+       GTK_WIDGET_SET_FLAGS (goto_bt, GTK_CAN_DEFAULT);
+       gtk_widget_set_sensitive (goto_bt, FALSE);
+
+       close_bt = gtk_button_new_with_label ("Close");
+       gtk_widget_ref (close_bt);
+       gtk_object_set_data_full (GTK_OBJECT (window1), "close_bt", close_bt,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_widget_show (close_bt);
+       gtk_signal_connect_after(GTK_OBJECT(close_bt), "clicked",
+                                                        
+GTK_SIGNAL_FUNC(s_closeClicked), NULL);
+       gtk_container_add (GTK_CONTAINER (hbuttonbox1), close_bt);
+       GTK_WIDGET_SET_FLAGS (close_bt, (GTK_CAN_DEFAULT | GTK_HAS_DEFAULT));
 
-       gtk_widget_show(topLevel);
+       gtk_grab_add(window1);
 
-       // set up search data through base class
-       setView(static_cast<FV_View *> (pFrame->getCurrentView()) );
-       
-       // go
-       gtk_main();
+       gtk_widget_show(window1);
+       return (window1);
+}
 
-       // clean up
-       gtk_widget_destroy(topLevel);
+GtkWidget *AP_UnixDialog_Goto::_constructWindowContents(void)
+{
+       GtkWidget *table;
+       GtkWidget *clist;
+       GtkWidget *scrolledwindow1;
+       GtkWidget *label;
+       GtkWidget *entry1;
+       GtkWidget *label2;
+       GtkWidget *label3;
+
+       table = gtk_table_new (3, 3, FALSE);
+       gtk_widget_ref (table);
+       gtk_object_set_data_full (GTK_OBJECT (table), "table", table,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_widget_show (table);
+
+       scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
+       gtk_widget_ref (scrolledwindow1);
+       gtk_object_set_data_full (GTK_OBJECT (table), "scrolledwindow1", 
+scrolledwindow1,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_widget_show (scrolledwindow1);
+       gtk_table_attach (GTK_TABLE (table), scrolledwindow1, 0, 1, 1, 2,
+                                         (GtkAttachOptions) (GTK_FILL),
+                                         (GtkAttachOptions) (GTK_FILL), 0, 0);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow1), 
+GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+       
+       clist = gtk_clist_new (1);
+       gtk_widget_ref (clist);
+       gtk_object_set_data_full (GTK_OBJECT (table), "clist", clist,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_widget_show (clist);
+       gtk_container_add (GTK_CONTAINER (scrolledwindow1), clist);
+       gtk_clist_set_column_width (GTK_CLIST (clist), 0, 80);
+       gtk_clist_set_selection_mode (GTK_CLIST (clist), GTK_SELECTION_BROWSE);
+       gtk_signal_connect (GTK_OBJECT (clist), "select_row",
+                                               GTK_SIGNAL_FUNC (s_targetChanged),
+                                               this);
+       m_iRow = 0;
+       char **tmp = getJumpTargets ();
+       for (int i = 0; tmp[i] != NULL; i++)
+               gtk_clist_append(GTK_CLIST (clist), &tmp[i]);
+
+       gtk_clist_column_titles_hide (GTK_CLIST (clist));
+       
+       label = gtk_label_new ("Go To What:");
+       gtk_widget_ref (label);
+       gtk_object_set_data_full (GTK_OBJECT (table), "label", label,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_widget_show (label);
+       gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+                                         (GtkAttachOptions) (GTK_FILL),
+                                         (GtkAttachOptions) (0), 0, 0);
+       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+       entry1 = gtk_entry_new ();
+       gtk_widget_ref (entry1);
+       gtk_object_set_data_full (GTK_OBJECT (table), "entry1", entry1,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_widget_show (entry1);
+       gtk_table_attach (GTK_TABLE (table), entry1, 1, 2, 1, 2,
+                                         (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                                         (GtkAttachOptions) (0), 0, 0);
+       gtk_signal_connect (GTK_OBJECT (entry1), "changed",
+                                               GTK_SIGNAL_FUNC (s_dataChanged), 
+NULL);
+
+       label2 = gtk_label_new ("Number:");
+       gtk_widget_ref (label2);
+       gtk_object_set_data_full (GTK_OBJECT (table), "label2", label2,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_widget_show (label2);
+       gtk_table_attach (GTK_TABLE (table), label2, 1, 2, 0, 1,
+                                         (GtkAttachOptions) (GTK_FILL),
+                                         (GtkAttachOptions) (0), 0, 0);
+       gtk_misc_set_alignment (GTK_MISC (label2), 0, 0.5);
+       
+       label3 = gtk_label_new ("TODO: Write some help text...");
+       gtk_widget_ref (label3);
+       gtk_object_set_data_full (GTK_OBJECT (table), "label3", label3,
+                                                         (GtkDestroyNotify) 
+gtk_widget_unref);
+       gtk_widget_show (label3);
+       gtk_table_attach (GTK_TABLE (table), label3, 1, 2, 2, 3,
+                                         (GtkAttachOptions) (GTK_FILL),
+                                         (GtkAttachOptions) (0), 0, 0);
+       gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5);
+       
+       return (table);
+}
 
+void AP_UnixDialog_Goto::_populateWindowData(void)
+{
 }
+
diff -u -r -x CVS abicommit/src/wp/ap/unix/ap_UnixDialog_Goto.h 
abigoto/src/wp/ap/unix/ap_UnixDialog_Goto.h
--- abicommit/src/wp/ap/unix/ap_UnixDialog_Goto.h       Sat May  1 03:46:00 1999
+++ abigoto/src/wp/ap/unix/ap_UnixDialog_Goto.h Thu Jun  1 00:44:54 2000
@@ -33,14 +33,23 @@
 
        static XAP_Dialog *             static_constructor(XAP_DialogFactory *, 
XAP_Dialog_Id id);
 
-       virtual void                    runModeless(XAP_Frame * pFrame);
+       virtual void                    runModal(XAP_Frame * pFrame);
+       void                    setSelectedRow(int row);
+       int                     getSelectedRow(void);
 
        // public so callbacks can access them
-       GtkWidget *                             targetList;
-       GtkWidget *                             targetEntry;
+/*             GtkWidget *                             targetList; */
+/*     GtkWidget *                             targetEntry; */
+       GtkWidget *             m_wMainWindow;
 
+       int                     m_iRow;
 protected:
-
+       GtkWidget *             _constructWindow(void);
+       GtkWidget *             _constructWindowContents(void);
+       void                    _populateWindowData(void);
+       static void             s_targetChanged(GtkWidget *, gint, gint,
+                                                                                      
+ GdkEventButton *,  AP_UnixDialog_Goto *);
 };
 
 #endif /* AP_UNIXDIALOG_GOTO_H */
+
diff -u -r -x CVS abicommit/src/wp/ap/xp/ap_Dialog_Goto.cpp 
abigoto/src/wp/ap/xp/ap_Dialog_Goto.cpp
--- abicommit/src/wp/ap/xp/ap_Dialog_Goto.cpp   Sat May  1 03:46:04 1999
+++ abigoto/src/wp/ap/xp/ap_Dialog_Goto.cpp     Thu Jun  1 00:44:54 2000
@@ -32,56 +32,27 @@
 #include "fl_DocLayout.h"
 #include "fv_View.h"
 
+char * AP_Dialog_Goto::s_pJumpTargets[] = {
+       "Page",
+       "Line",
+       "Picture",
+       NULL
+};
+
 AP_Dialog_Goto::AP_Dialog_Goto(XAP_DialogFactory * pDlgFactory, XAP_Dialog_Id id)
-       : XAP_Dialog_FramePersistent(pDlgFactory,id)
+       : XAP_Dialog_NonPersistent(pDlgFactory,id)
 {
-       persist_targetData = NULL;
-       persist_targetType = FV_JUMPTARGET_PAGE;
-               
-       m_pView = NULL;
-
-       m_targetType = FV_JUMPTARGET_PAGE;
-       m_targetData = NULL;
-
-       m_didSomething = UT_FALSE;
-
-       // is this used?
-       m_answer = a_VOID;
+       m_pView = NULL;
+       m_answer = a_CLOSE;
 }
 
 AP_Dialog_Goto::~AP_Dialog_Goto(void)
 {
-       UT_ASSERT(!m_bInUse);
-
-       FREEP(m_targetData);
-       
-       FREEP(persist_targetData);
 }
 
-void AP_Dialog_Goto::useStart(void)
+char ** AP_Dialog_Goto::getJumpTargets(void)
 {
-       UT_DEBUGMSG(("AP_Dialog_Goto::useStart(void) I've been called\n"));
-
-       XAP_Dialog_FramePersistent::useStart();
-
-       // restore from persistent storage
-       if (persist_targetData)
-               UT_UCS_cloneString(&m_targetData, persist_targetData);
-}
-
-void AP_Dialog_Goto::useEnd(void)
-{
-
-       UT_DEBUGMSG(("AP_Dialog_Goto::useEnd(void) I've been called\n"));
-       XAP_Dialog_FramePersistent::useEnd();
-
-       // persistent dialogs don't destroy this data
-       if (m_didSomething)
-       {
-               FREEP(persist_targetData);
-               if (m_targetData)
-                       UT_UCS_cloneString(&persist_targetData, m_targetData);
-       }
+       return (s_pJumpTargets);
 }
 
 AP_Dialog_Goto::tAnswer AP_Dialog_Goto::getAnswer(void) const
@@ -91,69 +62,14 @@
 }
 
 // --------------------------- Setup Functions -----------------------------
-
-UT_Bool AP_Dialog_Goto::setView(AV_View * view)
+UT_Bool AP_Dialog_Goto::setView(FV_View * view)
 {
-       // we can do a static cast from AV_View into FV_View,
-       // so we can get WP specific information from it.
-       // This could be bad once we introduce an
-       // outline view, etc.
-       UT_ASSERT(view);
-
-       m_pView = static_cast<FV_View *>(view);
+       m_pView = view;
 
        return UT_TRUE;
 }
 
-AV_View * AP_Dialog_Goto::getView(void) const
+FV_View * AP_Dialog_Goto::getView(void) const
 {
        return m_pView;
-}
-
-UT_Bool        AP_Dialog_Goto::setTargetType(FV_JumpTarget target)
-{
-       m_targetType = target;
-       return UT_TRUE;
-}
-
-FV_JumpTarget AP_Dialog_Goto::getTargetType(void)
-{
-       return m_targetType;
-}
-
-UT_Bool AP_Dialog_Goto::setTargetData(const UT_UCSChar * string)
-{
-       FREEP(m_targetData);
-       return UT_UCS_cloneString(&m_targetData, string);
-}
-
-UT_UCSChar * AP_Dialog_Goto::getTargetData(void)
-{
-       UT_UCSChar * string = NULL;
-       if (m_targetData)
-       {
-               if (UT_UCS_cloneString(&string, m_targetData))
-                       return string;
-       }
-       else
-       {
-               if (UT_UCS_cloneString_char(&string, ""))
-                       return string;
-       }
-       return NULL;
-}
-
-// --------------------------- Action Functions -----------------------------
-
-UT_Bool AP_Dialog_Goto::gotoTarget(void)
-{
-       UT_ASSERT(m_pView);
-
-       UT_ASSERT(m_targetData);
-
-       // so we save our attributes to persistent storage
-       m_didSomething = UT_TRUE;
-
-       // call view to do the work
-       return m_pView->gotoTarget(m_targetType, m_targetData);
 }
diff -u -r -x CVS abicommit/src/wp/ap/xp/ap_Dialog_Goto.h 
abigoto/src/wp/ap/xp/ap_Dialog_Goto.h
--- abicommit/src/wp/ap/xp/ap_Dialog_Goto.h     Sat May  1 03:46:04 1999
+++ abigoto/src/wp/ap/xp/ap_Dialog_Goto.h       Thu Jun  1 00:44:54 2000
@@ -22,32 +22,32 @@
 
 #include "xap_Frame.h"
 #include "xap_Dialog.h"
-#include "fv_View.h"
 #include "xav_View.h"
 #include "fl_BlockLayout.h"
 #include "pt_Types.h"
 
-class AP_Dialog_Goto : public XAP_Dialog_FramePersistent
+class FV_View;
+
+typedef enum _AP_JumpTarget
+{
+       AP_JUMPTARGET_PAGE,                             // beginning of page
+       AP_JUMPTARGET_LINE,
+       AP_JUMPTARGET_PICTURE // TODO
+} AP_JumpTarget;
+               
+class AP_Dialog_Goto : public XAP_Dialog_NonPersistent
 {
 public:
        AP_Dialog_Goto(XAP_DialogFactory * pDlgFactory, XAP_Dialog_Id id);
        virtual ~AP_Dialog_Goto(void);
 
-       virtual void                            useStart(void);
-       virtual void                            runModeless(XAP_Frame * pFrame) = 0;
-       virtual void                            useEnd(void);
+       virtual void                            runModal(XAP_Frame * pFrame) = 0;
 
        // these are kinda screwy now, but we never return anything but on
        // "cancel" or "close"
-       typedef enum
-               {
-                       a_VOID,
-                       a_FIND_NEXT,
-                       a_REPLACE,
-                       a_REPLACE_ALL,
-                       a_CANCEL
-               }
-       tAnswer;
+       typedef enum {
+               a_CLOSE
+       } tAnswer;
 
     AP_Dialog_Goto::tAnswer            getAnswer(void) const;
 
@@ -55,42 +55,18 @@
        // to set or read the variables in the current
        // instance of the dialog.  These do not read the persistent
        // values.
-       UT_Bool                                         setView(AV_View * view);
-       AV_View *                                       getView(void) const;
+       UT_Bool                                         setView(FV_View * view);
+       FV_View *                                       getView(void) const;
 
-       UT_Bool                                         setTargetType(FV_JumpTarget 
target);
-       FV_JumpTarget                           getTargetType(void);
-       
-       UT_Bool                                         setTargetData(const UT_UCSChar 
* string);
-       UT_UCSChar *                            getTargetData(void);
+       static char **              getJumpTargets(void); // TODO: Change to 
+UT_UCSChar
 
-       // Action functions... set data using the accessors
-       // above and call one of these.
-       UT_Bool                                         gotoTarget(void);
-       
  protected:
        
-       // These are the persistent dialog data items,
-       // which are carefully read and set by useStart()
-       // and useEnd(), and not by the accessors.
-       FV_JumpTarget                           persist_targetType;
-       UT_UCSChar *                            persist_targetData;
-               
        // These are the "current use" dialog data items,
        // which are liberally read and set by the
-       // accessor methods above.  Note that the buffers
-       // these may point to are destroyed when useEnd()
-       // is done storing them away
-       FV_View *                                       m_pView;
-
-       FV_JumpTarget                           m_targetType;
-       UT_UCSChar *                            m_targetData;
-
-       // These are also "current use" dialog data item,
-       // but they're not user-settable; they are set
-       // on conditions that action functions or other
-       // non-accessor methods are invoked.
-       UT_Bool                                         m_didSomething;
+       // accessor methods above.
+       FV_View *                                       m_pView;
+       static char *               s_pJumpTargets[];
 
        // is this used in a modeless dialog like this?
        tAnswer                                         m_answer;
diff -u -r -x CVS abicommit/src/wp/ap/xp/ap_EditMethods.cpp 
abigoto/src/wp/ap/xp/ap_EditMethods.cpp
--- abicommit/src/wp/ap/xp/ap_EditMethods.cpp   Thu Jun  1 02:06:57 2000
+++ abigoto/src/wp/ap/xp/ap_EditMethods.cpp     Thu Jun  1 01:50:07 2000
@@ -67,7 +67,6 @@
 #include "ie_impGraphic.h"
 #include "ie_exp.h"
 #include "ie_types.h"
-#include "ap_EditMethods.h"
 
 /*****************************************************************/
 /*****************************************************************/
@@ -2955,48 +2954,32 @@
 
 /*****************************************************************/
 
-#if 0
 static UT_Bool s_doGotoDlg(FV_View * pView, XAP_Dialog_Id id)
 {
        XAP_Frame * pFrame = (XAP_Frame *) pView->getParentData();
        UT_ASSERT(pFrame);
-
+       
        pFrame->raise();
-
+       
        XAP_DialogFactory * pDialogFactory
                = (XAP_DialogFactory *)(pFrame->getDialogFactory());
-
+       
        AP_Dialog_Goto * pDialog
                = (AP_Dialog_Goto *)(pDialogFactory->requestDialog(id));
        UT_ASSERT(pDialog);
 
-       pDialog->runModeless(pFrame);
-       
-       UT_Bool bOK = UT_TRUE;
-
-       // get result?
+       pDialog->setView(pView);
+       pDialog->runModal(pFrame);
        
-       pDialogFactory->releaseDialog(pDialog);
-
-       return bOK;
+       return UT_TRUE;
 }
-#endif
 
 Defun1(go)
 {
-#if 0
-       // TODO: this crashes on Win32.  does it work already on Linux?
        ABIWORD_VIEW;
        XAP_Dialog_Id id = AP_DIALOG_ID_GOTO;
-       
-       return s_doGotoDlg(pView, id);
-#else
-       XAP_Frame * pFrame = (XAP_Frame *) pAV_View->getParentData();
-       UT_ASSERT(pFrame);
 
-       s_TellNotImplemented(pFrame, "Go To dialog", __LINE__);
-       return UT_TRUE;
-#endif
+       return s_doGotoDlg(pView,id);
 }
 
 /*****************************************************************/

Reply via email to