2013-04-04 4 views
0

Я использую Gtk2Hs, и все эти вещи GTK для меня новы. Я работаю с TextView. Я хочу, чтобы заменил выбранный текст на новый текст и выберем новый текст. Ближайший я смог придумать это:Заменить выделенный текст и выбрать новый текст

-- Create marks so I can "remember" where the selection was 
(startIter, stopIter) <- textBufferGetSelectionBounds buffer 
startMark <- textBufferCreateMark buffer (Just "start") startIter True 
stopMark <- textBufferCreateMark buffer (Just "stop") stopIter True 

-- Delete the currently selected text 
textBufferDeleteSelection buffer True True 
-- now startIter and stopIter are no longer valid 

-- Insert the new text 
somehow convert startMark to startIter2 ??? 
textBufferInsert buffer startIter2 text 
-- now startIter2 is no longer valid 

-- Select the new text 
somehow convert startMark to startIter3 ??? 
somehow convert stopMark to stopIter3 ??? 
textBufferSelectRange buffer startIter3 stopIter3 

лишь функции, которые я нашел, чтобы установить выбор потребуется TextIter с, не TextMark с. Но я не смог найти какие-либо функции для получения текстового текста из TextMark. Это правильная процедура?

ответ

0

ОК, я нашел способ сделать это, используя TextMarks. Функция, которую я искал, была textBufferGetIterAtMark.

textBufferReplaceSelection 
    ∷ TextBufferClass self ⇒ self → String → IO() 
textBufferReplaceSelection buffer text = do 
    -- Create marks so I can "remember" where the selection was 
    (startIter, stopIter) <- textBufferGetSelectionBounds buffer 
    startMark <- textBufferCreateMark buffer (Just "start") startIter False 
    stopMark <- textBufferCreateMark buffer (Just "stop") stopIter True 

    -- Delete the currently selected text 
    textBufferDeleteSelection buffer True True 
    -- now startIter and stopIter are no longer valid 

    -- Insert the new text 
    startIter2 <- textBufferGetIterAtMark buffer startMark 
    textBufferInsert buffer startIter2 text 
    -- now startIter2 is no longer valid 

    -- Select the new text 
    startIter3 <- textBufferGetIterAtMark buffer startMark 
    stopIter3 <- textBufferGetIterAtMark buffer stopMark 
    textBufferSelectRange buffer startIter3 stopIter3 
0

У меня есть это решение. Он работает, даже с не-ASCII-символами, которые я тестировал. Тем не менее, мне все равно хотелось бы узнать, есть ли способ сделать это, используя TextMark s.

textBufferReplaceSelection buffer text = do 
    textBufferDeleteSelection buffer True True 
    textBufferInsertAtCursor buffer text 
    (_, end) <- textBufferGetSelectionBounds buffer 
    start <- textIterCopy end 
    textIterBackwardChars start (length text) 
    textBufferMoveMarkByName buffer "selection_bound" start 
Смежные вопросы