Page 1 of 1

Scintilla Readonly

Posted: Sun Aug 10, 2014 10:52 pm
by Dano
Hi everyone,

I quite like the Scintilla Gadget, and have been using it exclusively. Can someone tell me how to
make it readonly, so that one can't make changes to it? In reading the documentation there is
a SCI_SETREADONLY(bool readOnly), which I have enabled, but which still allows changes to be
made to the text, it sets an SCN_MODIFYATTEMPTRO, which I can only guess is a callback of
sorts which I have to check and then stop the changes being made. At this point my eyes are
glazing over as I have never used callbacks. I see in the Purebasic docs for Scintilla there is a
Callback parameter with a pointer to a structure in a Procedure to do this, but I am lost for
how to procede. Can anyone provide me with some sample code with which to learn from?

Dan

Re: Scintilla Readonly

Posted: Sun Aug 10, 2014 11:28 pm
by Danilo

Code: Select all

ScintillaSendMessage(0, #SCI_SETREADONLY, #True, 0)
Works fine here. How is it possible to still modify the document? (Disable menus like "Cut"/"Paste" etc. within your program when setting Scintilla to read-only)

Here is an example (cut&paste from PB help) that shows the callback notification:

Code: Select all

ProcedureDLL ScintillaCallBack(Gadget, *scinotify.SCNotification)
    ;
    ; The ProcedureDLL declaration is important for the callback to work correctly on MacOSX,
    ; on all other OS it has no effect.
    ;
    If *scinotify\nmhdr\code = #SCN_MODIFYATTEMPTRO ; search site http://www.scintilla.org/ScintillaDoc.html
        Debug "SCN_MODIFYATTEMPTRO"                 ; for 'SCN_MODIFYATTEMPTRO' to get info
    EndIf
EndProcedure

Procedure MakeScintillaText(text.s)
    Static sciText.s
    CompilerIf #PB_Compiler_Unicode
        sciText = Space(StringByteLength(text, #PB_UTF8))
        PokeS(@sciText, text, -1, #PB_UTF8)
    CompilerElse
        sciText = text
    CompilerEndIf
    ProcedureReturn @sciText
EndProcedure

If OpenWindow(0, 0, 0, 320, 90, "ScintillaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
    If InitScintilla()
        ScintillaGadget(0, 10, 10, 300, 70, @ScintillaCallBack())
        
        ; Output set to red color
        ScintillaSendMessage(0, #SCI_STYLESETFORE, 0, RGB(255, 0, 0))
        
        ; Set the initial text to the ScintillaGadget
        ScintillaSendMessage(0, #SCI_SETTEXT, 0, MakeScintillaText("This is a simple ScintillaGadget with text..."))
        
        ; Adding a second line of text with linebreak before
        Text$ = Chr(10) + "Second line"
        ScintillaSendMessage(0, #SCI_APPENDTEXT, Len(Text$), MakeScintillaText(Text$))
        
        ; set read-only
        ScintillaSendMessage(0, #SCI_SETREADONLY, #True, 0)
    EndIf
    
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Re: Scintilla Readonly

Posted: Mon Aug 11, 2014 12:42 am
by IdeasVacuum
You can use:

Code: Select all

DisableGadget(#MyScintilla, #True)

Re: Scintilla Readonly

Posted: Mon Aug 11, 2014 3:15 am
by Dano
IdeasVacuum,

Yours is closest to what I want, I don't want to be able to change anything on the editor. I guess when I think about it what I thought of as read-only is different than what I needed. In a read-only document I think
it is still possible to make changes, you just can't save them. My need was for the text to be locked so no one could make any changes, at least at the beginning. Later on I have to be able to change stuff. So the DisableGadget
was perfect for me, aside from my own Popup menu which I used Purebasic commands with and it still changes text in there, but I can disable that when I need to. Sorry for the confusion Danilo, from what I infer
from your comments the native Scintilla menu does the right thing. I never used them, I use the Purebasic menu commands, which I will have to disable and enable when I need to.

Thanks to both of you for your help,
Dan