static bool fileComplete( input_buffer *input, vi_key first_event ) { bool exit, done; vi_rc rc; vi_key event; int old_len; exit = false; if( input->curr_pos != strlen( input->buffer ) ) { MyBeep(); } else { saveStr( input ); old_len = strlen( input->buffer ) - 1; rc = StartFileComplete( input->buffer, old_len, input->buffer_length, first_event ); if( rc > ERR_NO_ERR ) { MyBeep(); } else { if( rc != FILE_COMPLETE ) { done = false; do { endColumn( input ); displayLine( input ); event = GetNextEvent( true ); switch( event ) { case VI_KEY( FAKEMOUSE ): case VI_KEY( MOUSEEVENT ): case VI_KEY( TAB ): case VI_KEY( SHIFT_TAB ): case VI_KEY( UP ): case VI_KEY( DOWN ): case VI_KEY( LEFT ): case VI_KEY( RIGHT ): case VI_KEY( PAGEDOWN ): case VI_KEY( PAGEUP ): case VI_KEY( ALT_END ): rc = ContinueFileComplete( input->buffer, old_len, input->buffer_length, event ); if( rc != ERR_NO_ERR ) { FinishFileComplete(); if( rc == FILE_COMPLETE_ENTER ) { exit = true; } done = true; } old_len = strlen( input->buffer ); break; default: KeyAdd( event ); PauseFileComplete(); done = true; } } while( !done ); } } } return( exit ); } /* fileComplete */
/* * RemoveEditSubClass - remove the sub-class of an edit control in a dialog */ void RemoveEditSubClass( HWND hwnd, int id ) { HWND edit; edit = GetDlgItem( hwnd, id ); SET_WNDPROC( edit, (LONG_PTR)oldEditProc ); (void)FreeProcInstance( editProc ); FinishFileComplete(); } /* RemoveEditSubClass */
/* * getStringInWindow: main routine */ static bool getStringInWindow( input_buffer *input ) { vi_key event; bool old_mode; ReadingAString = true; initInput( input ); input->last_str = alloca( input->buffer_length ); memset( input->last_str, 0, input->buffer_length ); if( input->h != NULL ) { input->curr_hist = input->h->curr; } for( ;; ) { event = GetNextEvent( false ); event = cursorKeyFilter( input, event ); event = historyFilter( input, event ); event = specialKeyFilter( input, event ); switch( event ) { case VI_KEY( NULL ): break; case VI_KEY( SHIFT_TAB ): case VI_KEY( TAB ): if( !fileComplete( input, event ) ) { endColumn( input ); break; } /* fall through */ case VI_KEY( ENTER ): if( input->buffer[0] == NO_ADD_TO_HISTORY_KEY ) { strcpy( &input->buffer[0], &input->buffer[1] ); } else { addHistory( input ); } /* fall through */ case VI_KEY( ESC ): finiInput( input ); /* * this call may not be necessary if the file complete window has * already closed of natural causes but it doesn't harm anything * if called when not needed - so we leave it here. */ FinishFileComplete(); ReadingAString = false; return( event != VI_KEY( ESC ) ); case VI_KEY( INS ): input->overstrike = !input->overstrike; if( !EditFlags.NoInputWindow ) { NewCursor( input->window.id, input->overstrike ? EditVars.NormalCursorType : EditVars.InsertCursorType ); } break; case VI_KEY( CTRL_END ): saveStr( input ); input->buffer[input->curr_pos] = '\0'; break; case VI_KEY( CTRL_X ): case VI_KEY( CTRL_U ): saveStr( input ); input->buffer[0] = '\0'; endColumn( input ); break; case VI_KEY( CTRL_INS ): swapString( input ); break; case VI_KEY( CTRL_V ): case VI_KEY( CTRL_Q ): insertChar( input, '^' ); displayLine( input ); // here we have a bit of a kluge input->curr_pos -= 1; event = GetNextEvent( false ); saveStr( input ); old_mode = input->overstrike; input->overstrike = true; insertChar( input, event ); input->overstrike = old_mode; break; case VI_KEY( ALT_END ): /* just want to redraw the line - for windows */ break; default: if( (event >= 32 && event < 256) || event == VI_KEY( CTRL_A ) ) { saveStr( input ); if( !insertChar( input, event ) ) { MyBeep(); } } } if( !EditFlags.NoInputWindow ) { displayLine( input ); } } } /* getStringInWindow */