-----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);
}
/*****************************************************************/