This patch implements the GoTo dialog for Win32.  It also enables
keyboard input on the About dialog, but that isn't nearly as important. :)
   You'll need to apply my previous patch (for patch for the Win32
WordCount dialog and keyboard input into modeless dialogs) in order for
this to work (it might compile, but it won't work right).

   -Tom

Index: src/wp/ap/win/ap_Win32Dialog_Goto.h

===================================================================

RCS file: /cvsroot/abi/src/wp/ap/win/ap_Win32Dialog_Goto.h,v

retrieving revision 1.2

diff -u -r1.2 ap_Win32Dialog_Goto.h

--- src/wp/ap/win/ap_Win32Dialog_Goto.h 2000/06/08 16:37:18     1.2

+++ src/wp/ap/win/ap_Win32Dialog_Goto.h 2000/07/02 18:49:21

@@ -36,9 +36,21 @@

        virtual void                    runModeless(XAP_Frame * pFrame);

        virtual void                    destroy(void);

        virtual void                    activate(void);

+       static BOOL CALLBACK    s_dlgProc(HWND,UINT,WPARAM,LPARAM);

+       void                                    GoTo (const char *number);

+       void                                    setSelectedRow (int row);

+       int                                             getSelectedRow (void);

 

+       void *                                  pGetWindowHandle( void ) { return 
+(void*)m_hWnd; }

+

 protected:

+       BOOL                                    _onInitDialog(HWND hWnd, WPARAM 
+wParam, LPARAM lParam);

+       BOOL                                    _onCommand(HWND hWnd, WPARAM wParam, 
+LPARAM lParam);

+

+       int                     m_iRow;

+       HWND                    m_hWnd;

 

+       char *                                  m_pszOldValue;

 };

 

 #endif /* AP_WIN32DIALOG_GOTO_H */

Index: src/wp/ap/win/ap_Win32Dialog_Goto.cpp

===================================================================

RCS file: /cvsroot/abi/src/wp/ap/win/ap_Win32Dialog_Goto.cpp,v

retrieving revision 1.2

diff -u -r1.2 ap_Win32Dialog_Goto.cpp

--- src/wp/ap/win/ap_Win32Dialog_Goto.cpp       2000/06/08 16:37:18     1.2

+++ src/wp/ap/win/ap_Win32Dialog_Goto.cpp       2000/07/02 18:49:21

@@ -34,6 +34,8 @@

 

 #include "ap_Win32Resources.rc2"

 

+#include "fv_View.h"

+

 /*****************************************************************/

 

 XAP_Dialog * AP_Win32Dialog_Goto::static_constructor(XAP_DialogFactory * pFactory, 
XAP_Dialog_Id id)

@@ -53,52 +55,272 @@

 

 void AP_Win32Dialog_Goto::activate(void)

 {

+       int iResult;

+       XAP_Frame *     pFrame = getActiveFrame();

+       XAP_Win32Frame * pWin32Frame = static_cast<XAP_Win32Frame *>(pFrame);

+

+       // Update the caption

+       ConstructWindowName();

+       SetWindowText(m_hWnd, m_WindowName);

+

+       SetFocus( GetDlgItem( m_hWnd,AP_RID_DIALOG_GOTO_EDIT_NUMBER ) );

+

+       iResult = ShowWindow( m_hWnd, SW_SHOW );

 

-       UT_ASSERT(UT_NOT_IMPLEMENTED);

+       iResult = BringWindowToTop( m_hWnd );

+

+       UT_ASSERT((iResult != 0));

 }

 

 

 void AP_Win32Dialog_Goto::destroy(void)

 {

+       DELETEP( m_pszOldValue );

+

+       int iResult = DestroyWindow( m_hWnd );

 

-       UT_ASSERT(UT_NOT_IMPLEMENTED);

+       UT_ASSERT((iResult != 0));

+

+       modeless_cleanup();

 }

 

 

 void AP_Win32Dialog_Goto::runModeless(XAP_Frame * pFrame)

 {

        UT_ASSERT(pFrame);

+

+       // raise the dialog

+       int iResult;

+       XAP_Win32App * pWin32App = static_cast<XAP_Win32App *>(m_pApp);

+       XAP_Win32Frame * pWin32Frame = static_cast<XAP_Win32Frame *>(pFrame);

+

+       LPCTSTR lpTemplate = NULL;

+

+       UT_ASSERT(m_id == AP_DIALOG_ID_GOTO);

+

+       lpTemplate = MAKEINTRESOURCE(AP_RID_DIALOG_GOTO);

+

+       // Change the third argument to

+       // pWin32Frame->getTopLevelWindow(),

+       // if you want the dialog to stay on top of the Abi windows

+       HWND hResult = CreateDialogParam(pWin32App->getInstance(),lpTemplate,

+                                                               GetDesktopWindow(),

+                                                               
+(DLGPROC)s_dlgProc,(LPARAM)this);

+

+       UT_ASSERT((hResult != NULL));

+

+       m_hWnd = hResult;

+

+       // Save dialog the ID number and pointer to the widget

+       UT_sint32 sid =(UT_sint32)  getDialogId();

+       m_pApp->rememberModelessId( sid, (XAP_Dialog_Modeless *) m_pDialog);

+

+       iResult = ShowWindow( m_hWnd, SW_SHOW );

 

-/*

-       NOTE: This template can be used to create a working stub for a 

-       new dialog on this platform.  To do so:

+       iResult = BringWindowToTop( m_hWnd );

+

+       UT_ASSERT((iResult != 0));

+}

+

+BOOL CALLBACK AP_Win32Dialog_Goto::s_dlgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM 
+lParam)

+{

+       // This is a static function.

+

+       AP_Win32Dialog_Goto * pThis;

        

-       1.  Copy this file (and its associated header file) and rename 

-               them accordingly. 

+       switch (msg)

+       {

+       case WM_INITDIALOG:

+               pThis = (AP_Win32Dialog_Goto *)lParam;

+               SetWindowLong(hWnd,DWL_USER,lParam);

+               return pThis->_onInitDialog(hWnd,wParam,lParam);

+               

+       case WM_COMMAND:

+               pThis = (AP_Win32Dialog_Goto *)GetWindowLong(hWnd,DWL_USER);

+               if (pThis)

+                       return pThis->_onCommand(hWnd,wParam,lParam);

+               else

+                       return 0;

+               

+       default:

+               return 0;

+       }

+}

 

-       2.  Do a case sensitive global replace on the words Stub and STUB

-               in both files. 

+void AP_Win32Dialog_Goto::GoTo (const char *number)

+{

+       UT_UCSChar *ucsnumber = (UT_UCSChar *) malloc (sizeof (UT_UCSChar) * 
+(strlen(number) + 1));

+       UT_UCS_strcpy_char (ucsnumber, number);

+       int target = this->getSelectedRow ();

+       this->getView()->gotoTarget ((AP_JumpTarget) target, ucsnumber);

+       free (ucsnumber);

+}

 

-       3.  Add stubs for any required methods expected by the XP class. 

-               If the build fails because you didn't do this step properly,

-               you've just broken the donut rule.  

-

-       4.      Replace this useless comment with specific instructions to 

-               whoever's porting your dialog so they know what to do.

-               Skipping this step may not cost you any donuts, but it's 

-               rude.  

-

-       This file should *only* be used for stubbing out platforms which 

-       you don't know how to implement.  When implementing a new dialog 

-       for your platform, you're probably better off starting with code

-       from another working dialog.  

-*/     

+void AP_Win32Dialog_Goto::setSelectedRow (int row)

+{

+       m_iRow = row;

+}

 

-       UT_ASSERT(UT_NOT_IMPLEMENTED);

+int AP_Win32Dialog_Goto::getSelectedRow (void)

+{

+       return (m_iRow);

 }

 

+#define _DSI(c,i)      SetDlgItemInt(hWnd,AP_RID_DIALOG_##c,m_count.##i,FALSE)

+#define _DS(c,s)       
+SetDlgItemText(hWnd,AP_RID_DIALOG_##c,pSS->getValue(AP_STRING_ID_##s))

+#define _DSX(c,s)      
+SetDlgItemText(hWnd,AP_RID_DIALOG_##c,pSS->getValue(XAP_STRING_ID_##s))

 

+BOOL AP_Win32Dialog_Goto::_onInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam)

+{

+       int iTarget;

+       char **ppszTargets;

+       const XAP_StringSet * pSS = m_pApp->getStringSet();

+

+       m_pszOldValue = NULL;

+

+       // Update the caption

+       ConstructWindowName();

+       SetWindowText(hWnd, m_WindowName);

+

+       // Disable the Go To button until something has been entered into the Number 
+box

+       EnableWindow( GetDlgItem(hWnd,AP_RID_DIALOG_GOTO_BTN_GOTO), FALSE );

+

+       m_iRow = 0;

+       ppszTargets = getJumpTargets();

+       for ( iTarget = 0; ppszTargets[ iTarget ] != NULL; iTarget++ )

+               SendMessage( GetDlgItem(hWnd,AP_RID_DIALOG_GOTO_LIST_WHAT), 
+LB_ADDSTRING, 0, (LPARAM)ppszTargets[ iTarget ] );

+

+       SendMessage(GetDlgItem(hWnd,AP_RID_DIALOG_GOTO_LIST_WHAT), LB_SETCURSEL, 
+m_iRow, 0);

+

+       // localize controls

+       _DSX(GOTO_BTN_CLOSE,            DLG_Close);

+       _DS(GOTO_BTN_GOTO,                      DLG_Goto_Btn_Goto);

+       _DS(GOTO_BTN_PREV,                      DLG_Goto_Btn_Prev);

+       _DS(GOTO_BTN_NEXT,                      DLG_Goto_Btn_Next);

+       _DS(GOTO_TEXT_WHAT,                     DLG_Goto_Label_What);

+       _DS(GOTO_TEXT_NUMBER,           DLG_Goto_Label_Number);

+       _DS(GOTO_TEXT_INFO,                     DLG_Goto_Label_Help);

 

+       SetFocus( GetDlgItem(hWnd,AP_RID_DIALOG_GOTO_EDIT_NUMBER) );

 

+       return 0;                                                       // 0 == we 
+called SetFocus()

+}

 

+BOOL AP_Win32Dialog_Goto::_onCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)

+{

+       char * pBuf = NULL;

+       UT_Bool bValueOK = TRUE;

+       WORD wNotifyCode = HIWORD(wParam);

+       WORD wId = LOWORD(wParam);

+       HWND hWndCtrl = (HWND)lParam;

+       DWORD dwTextLength, dwCounter, dwStart;

+       XAP_Frame *     pFrame = getActiveFrame();

+

+       switch (wId)

+       {

+       case IDCANCEL:                                          // also 
+AP_RID_DIALOG_GOTO_BTN_CLOSE

+               destroy();

+               return 1;

+

+       case AP_RID_DIALOG_GOTO_LIST_WHAT:

+               switch (HIWORD(wParam))

+               {

+               case LBN_SELCHANGE:

+                       m_iRow = (short) 
+SendMessage(GetDlgItem(hWnd,AP_RID_DIALOG_GOTO_LIST_WHAT), LB_GETCURSEL, 0, 0);

+                       return 1;

+

+               default:

+                       return 0;

+               }

+

+       case AP_RID_DIALOG_GOTO_BTN_PREV:

+               GoTo("-1");

+               return 1;

+

+       case AP_RID_DIALOG_GOTO_BTN_NEXT:

+               GoTo("+1");

+               return 1;

+

+       case AP_RID_DIALOG_GOTO_BTN_GOTO:

+               UT_ASSERT( m_pszOldValue );

+               GoTo( m_pszOldValue );

+               return 1;

+

+       case AP_RID_DIALOG_GOTO_EDIT_NUMBER:

+               switch (wNotifyCode)

+               {

+               case EN_UPDATE:

+                       dwTextLength = GetWindowTextLength( 
+GetDlgItem(hWnd,AP_RID_DIALOG_GOTO_EDIT_NUMBER) );

+                       

+                       if( dwTextLength )

+                       {

+                               pBuf = new char [ dwTextLength + 1 ];

+                               if( !pBuf )

+                                       return 0;

+                               

+                               GetWindowText( 
+GetDlgItem(hWnd,AP_RID_DIALOG_GOTO_EDIT_NUMBER), pBuf, dwTextLength + 1 );

+

+                               // If the first character is + or -, skip over it in 
+the

+                               // check loop below

+                               if( *pBuf == '-' || *pBuf == '+' )

+                                       dwStart = 1;

+                               else

+                                       dwStart = 0;

+

+                               // Make sure everything we have is numeric

+                               for( dwCounter = dwStart; dwCounter < dwTextLength; 
+dwCounter++ )

+                               {

+                                       if( !UT_UCS_isdigit( pBuf[ dwCounter ] ) )

+                                       {

+                                               if( m_pszOldValue == NULL )

+                                               {

+                                                       m_pszOldValue = new char[ 1 ];
+
+                                                       *m_pszOldValue = '\0';

+                                               }

+                                               

+                                               SetWindowText( 
+GetDlgItem(hWnd,AP_RID_DIALOG_GOTO_EDIT_NUMBER), m_pszOldValue );

+                                               

+                                               bValueOK = FALSE;

+

+                                               break;

+                                       }

+                               }

+

+                               if( bValueOK )

+                               {

+                                       if( m_pszOldValue != NULL )

+                                               DELETEP( m_pszOldValue );

+

+                                       m_pszOldValue = pBuf;

+

+                                       // Only enable the goto button if what we have 
+actually contains a number

+                                       EnableWindow( 
+GetDlgItem(hWnd,AP_RID_DIALOG_GOTO_BTN_GOTO), !(((pBuf[ 0 ] == '-') || (pBuf[ 0 ] == 
+'+')) && (pBuf[ 1 ] == '\0')) );

+                               }

+                               else

+                               {

+                                       FREEP( pBuf );

+

+                                       EnableWindow( 
+GetDlgItem(hWnd,AP_RID_DIALOG_GOTO_BTN_GOTO), FALSE );

+                               }

+                       }

+                       else

+                       {

+                               if( m_pszOldValue != NULL )

+                                       DELETEP( m_pszOldValue );

+

+                               m_pszOldValue = NULL;

+

+                               EnableWindow( 
+GetDlgItem(hWnd,AP_RID_DIALOG_GOTO_BTN_GOTO), FALSE );

+                       }

+

+                       return 1;

+               default:

+                       return 0;

+               }

+

+       default:                                                        // we did not 
+handle this notification

+               UT_DEBUGMSG(("WM_Command for id %ld\n",wId));

+               return 0;                                               // return zero 
+to let windows take care of it.

+       }

+}

 

Index: src/wp/ap/win/ap_Win32Resources.rc2

===================================================================

RCS file: /cvsroot/abi/src/wp/ap/win/ap_Win32Resources.rc2,v

retrieving revision 1.13

diff -u -r1.13 ap_Win32Resources.rc2

--- src/wp/ap/win/ap_Win32Resources.rc2 2000/04/26 14:34:18     1.13

+++ src/wp/ap/win/ap_Win32Resources.rc2 2000/07/02 18:49:21

@@ -41,8 +41,8 @@

 #define AP_RID_DIALOG_DATETIME                                 211

 #define AP_RID_DIALOG_FIELD                                            212

 #define AP_RID_DIALOG_WORDCOUNT                                        213

+#define AP_RID_DIALOG_GOTO                                             214

 

-

 #include "ap_Win32Resources_DialogReplace.rc2"

 #include "ap_Win32Res_DlgBreak.rc2"

 #include "ap_Win32Res_DlgField.rc2"

@@ -51,5 +51,5 @@

 #include "ap_Win32Res_DlgParagraph.rc2"

 #include "ap_Win32Res_DlgOptions.rc2"

 #include "ap_Win32Res_DlgWordCount.rc2"

+#include "ap_Win32Res_DlgGoto.rc2"

 #include "ap_Win32Res_Icons.rc2"

-

Index: src/af/xap/win/xap_Win32Dlg_About.cpp

===================================================================

RCS file: /cvsroot/abi/src/af/xap/win/xap_Win32Dlg_About.cpp,v

retrieving revision 1.17

diff -u -r1.17 xap_Win32Dlg_About.cpp

--- src/af/xap/win/xap_Win32Dlg_About.cpp       2000/06/19 14:59:04     1.17

+++ src/af/xap/win/xap_Win32Dlg_About.cpp       2000/07/02 18:49:21

@@ -158,7 +158,7 @@

                

        HWND hwndOK = CreateWindow("BUTTON",

                                                           "OK",                // 
TODO isn't this in the strings file?

-                                                          WS_CHILD | WS_VISIBLE | 
BS_DEFPUSHBUTTON,

+                                                          WS_CHILD | WS_VISIBLE | 
+WS_TABSTOP | BS_DEFPUSHBUTTON,

                                                           iWidth - BUTTON_WIDTH - 
BUTTON_GAP,

                                                           iHeight - BUTTON_HEIGHT - 
BUTTON_GAP,

                                                           BUTTON_WIDTH,

@@ -170,7 +170,7 @@

 

        HWND hwndURL = CreateWindow("BUTTON",

                                                                "www.abisource.com",

-                                                               WS_CHILD | WS_VISIBLE,

+                                                               WS_CHILD | WS_VISIBLE 
+| WS_TABSTOP,

                                                                iWidth - BUTTON_WIDTH 
- BUTTON_GAP - 2*BUTTON_WIDTH - BUTTON_GAP,

                                                                iHeight - 
BUTTON_HEIGHT - BUTTON_GAP,

                                                                BUTTON_WIDTH*2,

@@ -276,6 +276,9 @@

                {

                        if (GetMessage(&msg, NULL, 0, 0))

                        {

+                               if( hwndAbout && IsDialogMessage( hwndAbout, &msg ) )

+                                       continue;

+

                                TranslateMessage(&msg);

                                DispatchMessage(&msg);

                        }

// AbiWord
// Copyright (C) 2000 AbiSource, Inc.
// 
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  
// 02111-1307, USA.
//////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////
// THIS FILE IS INCLUDED BY .cpp AND .rc FILES.
//
// *** RC.exe IS BRAIN-DAMAGED.  GIVING THIS FILE AN .rc2
// *** EXTENSION MAKES #INCLUDING THIS FILE FROM Win32Main.rc
// *** WORK -- IF THE SUFFIX IS .h ONLY THE #DEFINES WORK, THE
// *** DIALOGS DO NOT GET COMPILED.
//
//////////////////////////////////////////////////////////////////

#define AP_RID_DIALOG_GOTO_BTN_GOTO             1001
#define AP_RID_DIALOG_GOTO_BTN_NEXT             1002
#define AP_RID_DIALOG_GOTO_BTN_PREV             1003
#define AP_RID_DIALOG_GOTO_TEXT_WHAT            1004
#define AP_RID_DIALOG_GOTO_LIST_WHAT            1005
#define AP_RID_DIALOG_GOTO_TEXT_NUMBER          1006
#define AP_RID_DIALOG_GOTO_EDIT_NUMBER          1007
#define AP_RID_DIALOG_GOTO_TEXT_INFO            1008
#define AP_RID_DIALOG_GOTO_BTN_CLOSE                    IDCANCEL

#ifdef RC_INVOKED
// NOTE -- these placeholder strings get overridden at runtime 
// NOTE -- they're just here to make sizing easier

AP_RID_DIALOG_GOTO DIALOG DISCARDABLE  0, 0, 270, 110
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Go To"
FONT 8, "MS Sans Serif"
BEGIN
    PUSHBUTTON      "&Close",                   AP_RID_DIALOG_GOTO_BTN_CLOSE,   
200,88,62,14
        LISTBOX         ,                                       
AP_RID_DIALOG_GOTO_LIST_WHAT,   8,17,62,74, LBS_NOTIFY | WS_BORDER | WS_TABSTOP

        EDITTEXT                                                
AP_RID_DIALOG_GOTO_EDIT_NUMBER, 74,17,188,14

    DEFPUSHBUTTON   "&Goto",                    AP_RID_DIALOG_GOTO_BTN_GOTO,    
136,88,62,14
        PUSHBUTTON      "&Next >>",                     AP_RID_DIALOG_GOTO_BTN_NEXT,   
 72,88,62,14
        PUSHBUTTON      "<< &Prev",                     AP_RID_DIALOG_GOTO_BTN_PREV,   
 8,88,62,14
        LTEXT           "Go To What",           AP_RID_DIALOG_GOTO_TEXT_WHAT,   
8,8,62,8
        LTEXT           "&Number",                      
AP_RID_DIALOG_GOTO_TEXT_NUMBER, 74,8,38,8
        LTEXT           "Info here",            AP_RID_DIALOG_GOTO_TEXT_INFO,   
74,33,188,54
END
#endif /* RC_INVOKED */

Reply via email to