Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- EnableExplicit
- InitScintilla()
- ; #MENU_EXTEND_SELECTION=10
- Define txt$, txtLen, marginWidth, Gadget
- Declare Color(*regex, regexLength, n)
- Declare Color2(*regex, regexLength, n)
- Declare MakeUTF8Text(text.s)
- Declare MakeScintillaText(text.s, *sciLength.Integer=0)
- Declare OpenFileR(*sciLength.Integer=0)
- Declare SciNotification(Gadget, *scinotify.SCNotification)
- Declare ReadFileR(Path$)
- ; Procedure ExtendScintillaSelection()
- ; Protected mainSel, selStart, selEnd
- ; mainSel=ScintillaSendMessage(0, #SCI_GETMAINSELECTION)
- ; selStart=ScintillaSendMessage(0, #SCI_GETSELECTIONNSTART, mainSel)
- ; selEnd=ScintillaSendMessage(0, #SCI_GETSELECTIONNEND, mainSel)
- ;
- ; EndProcedure
- txt$="Вставка теста "+#LF$+
- "вы можете использовать это код как пример работы со Scintilla"+#LF$+
- "ссылка http://purebasic.info/phpBB3ex/index.php"+#LF$+
- "Это поиск, маркеры, стилизация, и т.д. 2222 "+#LF$
- ; Define i
- ; For i = 1 To 500
- ; txt$+#LF$+"Line: "+Str(i)
- ; Next
- txtLen=StringByteLength(txt$, #PB_UTF8)
- OpenWindow(100, 0, 0, 900, 600, "Редактор Scintilla", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget)
- ; Создание гаджета размером на всё окно
- ScintillaGadget(0, 0, 0, WindowWidth(100), WindowHeight(100), @SciNotification())
- ; Устанавливает режим текста
- ScintillaSendMessage(0, #SCI_SETWRAPMODE, #SC_WRAP_NONE) ; без переносов строк
- ScintillaSendMessage(0, #SCI_SETCODEPAGE, #SC_CP_UTF8) ; в кодировке UTF-8
- ; ScintillaSendMessage(0, #SCI_SETVIRTUALSPACEOPTIONS, #SCVS_RECTANGULARSELECTION | #SCVS_USERACCESSIBLE) ; позволить установить курсор и выделение за пределами конца строки
- ; Устанавливает текущую подсветку строки
- ScintillaSendMessage(0, #SCI_SETCARETLINEVISIBLE, 1) ; подсвечивает текущую строку
- ScintillaSendMessage(0, #SCI_SETCARETLINEVISIBLEALWAYS, 1) ; подсвечивает всегда, даже при потере фокуса
- ; ScintillaSendMessage(0, #SCI_SETCARETLINEBACKALPHA, 255) ; прозрачность подсветки текущей строки (0-255), 255 прозрачна на 100%
- ScintillaSendMessage(0, #SCI_SETCARETLINEBACK, RGB(0, 0, 0)) ; цвет подсвеченной строки
- ; Устанавливает стиль текста
- ScintillaSendMessage(0, #SCI_STYLESETFONT, #STYLE_DEFAULT, MakeUTF8Text("Arial")) ; выделение прямоугольником лучше работает с моноширинным шрифтом Courier New
- ScintillaSendMessage(0, #SCI_STYLESETBACK, #STYLE_DEFAULT, RGB(63, 63, 63)) ; цвет фона
- ScintillaSendMessage(0, #SCI_STYLESETFORE, #STYLE_DEFAULT, RGB(153, 153, 153)) ; цвет текста
- ScintillaSendMessage(0, #SCI_STYLECLEARALL)
- ; Устанавливает размер отступа и стиль колонки номеров строк
- ScintillaSendMessage(0, #SCI_STYLESETFONT, #STYLE_LINENUMBER, MakeUTF8Text("Arial")) ; шрифт номеров строк
- ScintillaSendMessage(0, #SCI_STYLESETBACK, #STYLE_LINENUMBER, RGB(33, 33, 33)) ; цвет фона поля номеров строк
- ScintillaSendMessage(0, #SCI_STYLESETFORE, #STYLE_LINENUMBER, RGB(153, 153, 153)) ; цвет текста поля номеров строк
- marginWidth=ScintillaSendMessage(0, #SCI_TEXTWIDTH, #STYLE_LINENUMBER, MakeUTF8Text("_999")) ; ширина поля номеров строк
- ScintillaSendMessage(0, #SCI_SETMARGINTYPEN, 0, #SC_MARGIN_NUMBER)
- ScintillaSendMessage(0, #SCI_SETMARGINWIDTHN, 0, marginWidth) ; Устанавливает ширину поля номеров строк
- marginWidth=0
- ScintillaSendMessage(0, #SCI_SETMARGINMASKN, 2, #SC_MASK_FOLDERS) ; Устанавливает отступ для поля свёртывания с запасом сгиба
- ScintillaSendMessage(0, #SCI_SETMARGINWIDTHN, 2, marginWidth) ; Устанавливает ширину поля свёртывания
- ScintillaSendMessage(0, #SCI_SETMARGINSENSITIVEN, 2, #True) ; Устанавливает чуствительность поля к клику
- ; Устанавливает стиль текстовго курсора и выделения
- ScintillaSendMessage(0, #SCI_SETCARETSTICKY, 1) ; делает всегда видимым (?)
- ScintillaSendMessage(0, #SCI_SETCARETWIDTH, 1) ; толщина текстовго курсора
- ScintillaSendMessage(0, #SCI_SETCARETFORE, RGB(255, 255, 255)) ; цвет текстовго курсора
- ScintillaSendMessage(0, #SCI_SETSELALPHA, 100) ; прозрачность выделения
- ScintillaSendMessage(0, #SCI_SETSELBACK, 1, RGB(255, 255, 255)) ; цвет фона выделения
- ScintillaSendMessage(0, #SCI_SETSELFORE, 1, RGB(160, 160, 160)) ; цвет текста выделения
- ; Устанавливает дополнительные стили при использовании множественного курсора и выделения
- ScintillaSendMessage(0, #SCI_SETADDITIONALCARETFORE, RGB(255, 160, 160)) ; цвет дополнительного текстовго курсора
- ScintillaSendMessage(0, #SCI_SETADDITIONALCARETSBLINK, 1) ; мигание дополнительного текстовго курсора
- ScintillaSendMessage(0, #SCI_SETADDITIONALSELALPHA, 100) ; прозрачность дополнительного выделения
- ScintillaSendMessage(0, #SCI_SETADDITIONALSELBACK, RGB(255, 255, 100)) ; цвет фона дополнительного выделения
- ScintillaSendMessage(0, #SCI_SETADDITIONALSELFORE, RGB(255, 255, 130)) ; цвет текста дополнительного выделения
- ; Разрешает множественный курсор
- ScintillaSendMessage(0, #SCI_SETRECTANGULARSELECTIONMODIFIER, #SCMOD_ALT); выделить, удерживая нажатой клавишу Alt
- ScintillaSendMessage(0, #SCI_SETMULTIPLESELECTION, 1) ; позволяет выделить несколько раз удерживая нажатой клавишу CTRL или CMD
- ScintillaSendMessage(0, #SCI_SETMULTIPASTE, #SC_MULTIPASTE_EACH) ; множественная вставка текста
- ScintillaSendMessage(0, #SCI_SETADDITIONALSELECTIONTYPING, 1) ; позволяет ввод текста, перемешение курсора и т.д. сразу в нескольких местах
- ; ScintillaSendMessage(0, #SCI_USEPOPUP, 1)
- ; ScintillaSendMessage(0, #SCI_SETVSCROLLBAR, 1) ; вертикальная полоса прокрутки всегда
- ; Разрешить горячую клаваишу CTRL + D для дополнительного авто выделения
- ; AddKeyboardShortcut(100, #PB_Shortcut_Control | #PB_Shortcut_D, #MENU_EXTEND_SELECTION)
- ; BindEvent(#PB_Event_Menu, ExtendScintillaSelection())
- ScintillaSendMessage(0, #SCI_SETTEXT, 0, MakeUTF8Text(txt$)) ; Установить текст гаджета
- ScintillaSendMessage(0, #SCI_GOTOPOS, txtLen) ; Курсор в конец текста
- SetActiveGadget(0) ; Установить гаджет активным, фокус ввода
- ; Эти константы будут использоватся для подсветки синтаксиса.
- Enumeration 0
- #LexerState_Space
- #LexerState_Number
- #LexerState_Keyword
- #LexerState_String
- #LexerState_Preprocessor
- #LexerState_Operator
- #LexerState_Comment
- #LexerState_FoldKeyword
- EndEnumeration
- ScintillaSendMessage(0, #SCI_STYLESETFORE, #LexerState_Comment, RGB(113, 174, 113)) ; Цвет комментариев
- ScintillaSendMessage(0, #SCI_STYLESETFORE, #LexerState_Number, $ABCEE3) ; Цвет чисел, BGR
- ScintillaSendMessage(0, #SCI_STYLESETFORE, #LexerState_Keyword, $FF9F00) ; Цвет ключевых слов, BGR
- ScintillaSendMessage(0, #SCI_STYLESETFORE, #LexerState_Preprocessor, $DE97D9) ; Цвет препроцессор, BGR
- ScintillaSendMessage(0, #SCI_STYLESETFORE, #LexerState_Operator, $8080FF) ; Цвет препроцессор, BGR
- ScintillaSendMessage(0, #SCI_STYLESETFORE, #LexerState_FoldKeyword, RGB(0, 136, 0)) ; Цвет ключевых слов со сворачиванием.
- ScintillaSendMessage(0, #SCI_STYLESETBOLD, #LexerState_Number, 1) ; Выделять чисел жирным шрифтом
- ScintillaSendMessage(0, #SCI_STYLESETITALIC, #LexerState_Comment, 1) ; Выделять комментарии наклонным шрифтом
- ; MessageRequester(Str(#STYLE_LINENUMBER) , Str(#STYLE_DEFAULT)) ; тут проверяем константы других стилей, почем они не мешают
- ; Для RGB из Веб
- ; Global num.i = Val("$71AE71")
- ; Global num_text.s = Str(Red(num)) + ", " + Str(Green(num)) + ", " + Str(Blue(num))
- ; Debug num_text ; Отображает цвет в формате функции RGB
- ; Пробуем применить стиль (проблема с позиционированием и длинной)
- ScintillaSendMessage(0, #SCI_STARTSTYLING, 50, 0) ; позиция начала (с 50-го)
- ScintillaSendMessage(0, #SCI_SETSTYLING, 14, #LexerState_Comment) ; ширина и номер стиля
- If CreateMenu(0, WindowID(100)) ; Здесь начинается создание меню....
- MenuTitle("Меню")
- MenuItem(1, "Открыть файл")
- MenuItem(2, "Вставить текущую дату")
- MenuItem(3, "Вставить из буфера обмена")
- MenuBar() ; разделитель
- MenuItem(4, "Выход")
- MenuItem(5, "Найти числа (индикаторы)")
- MenuItem(6, "Найти числа (стиль)")
- MenuItem(7, "Очистить стиль")
- EndIf
- Global Event, em, Text$, TextLength, regex$
- Repeat
- Event = WaitWindowEvent()
- Select Event
- Case #PB_Event_SizeWindow
- ResizeGadget(0, #PB_Ignore, #PB_Ignore, WindowWidth(100), WindowHeight(100))
- Case #PB_Event_Menu
- em = EventMenu()
- Select em
- Case 1
- OpenFileR()
- Case 2
- Text$ = FormatDate("%dd.%mm.%yyyy", Date()) ; Возвращает текущую дату
- ; ScintillaSendMessage(0, #SCI_APPENDTEXT, Len(Text$), MakeUTF8Text(Text$)) ; не работает с UTF-8
- ; ScintillaSendMessage(0, #SCI_INSERTTEXT, txtLen, MakeUTF8Text(Text$)) ; проблема измерять длину текста в Scintilla каждый раз
- ScintillaSendMessage(0, #SCI_APPENDTEXT, TextLength, MakeScintillaText(Text$, @TextLength))
- Case 3
- ; Text$ = "вставленный текст" ; перед вставкой приводится к формату UTF-8
- Text$ = GetClipboardText()
- ScintillaSendMessage(0, #SCI_APPENDTEXT, TextLength, MakeScintillaText(Text$, @TextLength))
- Case 4
- Break
- Case 5
- regex$ = "\d+"
- Color(MakeScintillaText(regex$, @TextLength), Len(regex$), 7)
- Case 6
- regex$ = "\d+"
- Color2(MakeScintillaText(regex$, @TextLength), Len(regex$), 7)
- Case 7
- ScintillaSendMessage(0, #SCI_CLEARDOCUMENTSTYLE)
- EndSelect
- Case #PB_Event_CloseWindow
- Break
- EndSelect
- ForEver
- FreeMenu(0)
- CloseWindow(100)
- End
- ; Уведомления
- ProcedureDLL SciNotification(Gadget, *scinotify.SCNotification)
- Protected Path$, pos
- ; Select Gadget
- ; Case 0 ; уведомление гаджету 0 (Scintilla)
- With *scinotify
- Select \nmhdr\code
- Case #SCN_URIDROPPED ; о броске файлов в окно
- ; Debug PeekS(*scinotify.SCNotification\text, -1, #PB_Ascii)
- Path$ = PeekS(*scinotify.SCNotification\text, -1, #PB_UTF8 | #PB_ByteLength)
- ; Path$ = PeekS(*scinotify.SCNotification\text, -1, #PB_Ascii)
- pos = FindString(Path$, Chr(10)) ; обрезка, оставляя 1 файл
- If pos
- Path$ = LSet(Path$ , pos-2)
- EndIf
- Path$ = RemoveString(Path$ , "file://", #PB_String_CaseSensitive, 1, 1) ; удалить 1 раз
- Debug Path$
- ReadFileR(Path$)
- EndSelect
- EndWith
- ; EndSelect
- EndProcedure
- ; Преобразование текста в текст для вставки в Scintilla
- Procedure MakeUTF8Text(text.s)
- Static buffer.s
- buffer=Space(StringByteLength(text, #PB_UTF8))
- PokeS(@buffer, text, -1, #PB_UTF8)
- ProcedureReturn @buffer
- EndProcedure
- Procedure MakeScintillaText(text.s, *sciLength.Integer=0)
- Static sciLength : sciLength=StringByteLength(text, #PB_UTF8) ; #TextEncoding
- Static sciText.s : sciText = Space(sciLength)
- If *sciLength : *sciLength\i=sciLength : EndIf ;<--- Возвращает длину буфера scintilla (требуется для определенной команды scintilla)
- PokeS(@sciText, text, -1, #PB_UTF8) ; #TextEncoding
- ProcedureReturn @sciText
- EndProcedure
- Procedure OpenFileR(*sciLength.Integer=0)
- ; Запрос пути к файлу
- Protected Path$ = OpenFileRequester("Выберите файл","","Текст|*.txt;*.bat;*.pb|Все файлы (*.*)|*.*",0)
- If Path$ ; так как sciLength = 0 это критерий отмены для следующей функции
- ReadFileR(Path$)
- EndIf
- EndProcedure
- Procedure ReadFileR1(Path$) ; свой вариант заменил вариантом из справки, см ниже
- Protected sizefile, *MemoryBuffer
- sizefile = FileSize(Path$) ; определяем размер данных в байтах
- If sizefile => 0 ; файл существует
- *MemoryBuffer = AllocateMemory(sizefile) ; выделение памяти под размер файла
- ReadFile(0 , Path$, #PB_UTF8)
- ReadData(0, *MemoryBuffer, sizefile) ; чтение файла в память
- CloseFile(0) ; закрытие файла
- ScintillaSendMessage(0, #SCI_SETTEXT, 0, *MemoryBuffer)
- ; ScintillaSendMessage(0, #SCN_UPDATEUI, #SC_UPDATE_V_SCROLL) ; не то, надо обновить прокрутку
- FreeMemory(*MemoryBuffer)
- EndIf
- EndProcedure
- Procedure ReadFileR(Path$)
- Protected length, *MemoryID
- If ReadFile(0, Path$)
- length = Lof(0) ; получаем длину открытого файла
- *MemoryID = AllocateMemory(length) ; выделяем необходимую память
- If *MemoryID
- ReadData(0, *MemoryID, length) ; считаем все данные в блок памяти
- EndIf
- CloseFile(0)
- ScintillaSendMessage(0, #SCI_SETTEXT, 0, *MemoryID)
- FreeMemory(*MemoryID)
- EndIf
- EndProcedure
- ; Подсвечивание через индикаторы
- Procedure Color(*regex, regexLength, n)
- Protected txtLen, StartPos, EndPos, firstMatchPos
- ; Устанавливает режим поиска (REGEX + POSIX фигурные скобки)
- ScintillaSendMessage(0, #SCI_SETSEARCHFLAGS, #SCFIND_REGEXP | #SCFIND_POSIX)
- ; Устанавливает целевой диапазон поиска
- txtLen = ScintillaSendMessage(0, #SCI_GETTEXTLENGTH) ; получает длину текста
- ScintillaSendMessage(0, #SCI_INDICSETSTYLE, n, 6) ; #INDIC_TEXTFORE = 17 создаёт индикатор под номером 7 (занятые по уиолчанию 0, 1, 2)
- ScintillaSendMessage(0, #SCI_INDICSETFORE, n, $71AE71) ; назначает цвет индикатора под номером 7 - зелёный
- EndPos = 0
- Repeat
- ScintillaSendMessage(0, #SCI_SETTARGETSTART, EndPos) ; от начала (задаём область поиска) используя позицию конца предыдущего поиска
- ScintillaSendMessage(0, #SCI_SETTARGETEND, txtLen) ; до конца по длине текста
- firstMatchPos=ScintillaSendMessage(0, #SCI_SEARCHINTARGET, regexLength, *regex) ; возвращает позицию первого найденного. В параметрах длина искомого и указатель
- If firstMatchPos>-1 ; если больше -1, то есть найдено, то
- StartPos=ScintillaSendMessage(0, #SCI_GETTARGETSTART) ; получает позицию начала найденного
- EndPos=ScintillaSendMessage(0, #SCI_GETTARGETEND) ; получает позицию конца найденного
- ScintillaSendMessage(0, #SCI_SETINDICATORCURRENT, n) ; делает индикатор под номером 7 текущим
- ScintillaSendMessage(0, #SCI_INDICATORFILLRANGE, StartPos, EndPos - StartPos) ; выделяет текст используя текущий индикатор
- Else
- Break
- EndIf
- ForEver
- EndProcedure
- ; Подсвечивание через стиль
- Procedure Color2(*regex, regexLength, n)
- Protected txtLen, StartPos, EndPos, firstMatchPos
- ; Устанавливает режим поиска (REGEX + POSIX фигурные скобки)
- ScintillaSendMessage(0, #SCI_SETSEARCHFLAGS, #SCFIND_REGEXP | #SCFIND_POSIX)
- ; Устанавливает целевой диапазон поиска
- txtLen = ScintillaSendMessage(0, #SCI_GETTEXTLENGTH) ; получает длину текста
- EndPos = 0
- Repeat
- ScintillaSendMessage(0, #SCI_SETTARGETSTART, EndPos) ; от начала (задаём область поиска) используя позицию конца предыдущего поиска
- ScintillaSendMessage(0, #SCI_SETTARGETEND, txtLen) ; до конца по длине текста
- firstMatchPos=ScintillaSendMessage(0, #SCI_SEARCHINTARGET, regexLength, *regex) ; возвращает позицию первого найденного. В параметрах длина искомого и указатель
- If firstMatchPos>-1 ; если больше -1, то есть найдено, то
- StartPos=ScintillaSendMessage(0, #SCI_GETTARGETSTART) ; получает позицию начала найденного
- EndPos=ScintillaSendMessage(0, #SCI_GETTARGETEND) ; получает позицию конца найденного
- ScintillaSendMessage(0, #SCI_STARTSTYLING, StartPos, 0) ; позиция начала (с 50-го)
- ScintillaSendMessage(0, #SCI_SETSTYLING, EndPos - StartPos, #LexerState_Number) ; ширина и номер стиля
- Else
- Break
- EndIf
- ForEver
- EndProcedure
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement