File "Highlighter.inc"

Path: /HotKeyMgr/inc/Highlighter.inc
File size: 5.85 KB
MIME-type:
Charset: utf-8


%HLTdelta = 40

'--------------------------------------------------------------------------------
GLOBAL OldHLTProc   AS LONG
'--------------------------------------------------------------------------------

'--------------------------------------------------------------------------------
SUB HighlightCurrentLine(hD AS DWORD, hlcol AS STRING)
    LOCAL e, r AS STRING
    LOCAL i, j AS LONG

    ' Get html code
    SendString "{HOME}{SHIFT_D}{END}{SHIFT_U}{CTRL_D}c{CTRL_U}"
    SLEEP 50
    e = ClipBoardHtmlGet(hD)
    IF LEN(e) = 0 THEN BEEP : EXIT SUB

    ' Handle buffer overflow
    i = INSTR(e, "</html>")
    IF i > 0 THEN
        i = INSTR(i, e, $CRLF) + LEN($CRLF)
        e = LEFT$(e, i-1)
    ELSE
        BEEP
        ?e,,EXE.NAME$
    END IF

    ' If already highlighted: change highlight color
    IF  INSTR(e, "background:") > 0 AND INSTR(e, "mso-highlight:") > 0 THEN
        r = e
        i = INSTR(r, "background:")
        WHILE i > 0
            i += LEN("background:")
            j = INSTR(i, r, ";")
            r = LEFT$(r, i-1) + hlcol + MID$(r, j)
            i = INSTR(i, r, "mso-highlight:")
            j = INSTR(i, r, "'")
            r = LEFT$(r, i-1) + hlcol + MID$(r, j)
            i = INSTR(i, r, "background:")
        WEND

    ' Else if not highlighted, add single highlight around fragment zone
    ELSE
        i = INSTR(e, "<!--StartFragment-->") + LEN("<!--StartFragment-->")
        j = INSTR(i, e, "<!--EndFragment-->")
        r = LEFT$(e, i-1) _
          + "<span style='background:" + hlcol _
          + ";mso-highlight:" + hlcol + "'>" _
          + MID$(e, i, j-i) _
          + "</span>" _
          + MID$(e, j)
    END IF

    ' Update HTML clipboard header
    ClipBoardHtmlUpdateHeader(r)

    ' Put raw result in clipboard
    ClipBoardHtmlSetRaw(hD, r)
    SLEEP 50

END SUB
'--------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION HLTProc(BYVAL hWnd AS LONG, BYVAL Msg AS LONG, _
                 BYVAL wParam AS LONG, BYVAL lParam AS LONG) AS LONG
    LOCAL hDlg AS DWORD
    STATIC c   AS STRING

    IF Msg = %WM_KEYDOWN THEN                       ' Key press event

        c = ""
        SELECT CASE wParam
            CASE 96  : c = "transparent"            ' 0: transparent (keydown 96)
            CASE 97  : c = "aqua"                   ' 1: aqua (keydown 97)
            CASE 98  : c = "lime"                   ' 2: lime (keydown 98)
            CASE 99  : c = "fuchsia"                ' 3: fuchsia (keydown 99)
            CASE 100 : c = "yellow"                 ' 4: yellow (keydown 100)
        END SELECT

    ELSEIF Msg = %WM_KEYUP THEN                     ' Key release event

        IF c <> "" THEN
            WINDOW GET PARENT hWnd TO hDlg : hDlg = GetParent(hDlg)
            DIALOG END GetParent(hWnd), -1          ' Close highlighter dialog
            HighlightCurrentLine hDlg, c            ' Highlight current line in OneNote
            c = ""
        END IF

    END IF

    FUNCTION = CallWindowProc(OldHLTProc, hWnd, Msg, wParam, lParam)

END FUNCTION
'------------------------------------------------------------------------------

'--------------------------------------------------------------------------------
CALLBACK FUNCTION ProcHighlight()
    LOCAL  hEdit    AS DWORD
    LOCAL  i, c     AS DWORD

    SELECT CASE CB.MSG
        CASE %WM_INITDIALOG
            ' Initialization handler: draw graphic
            GRAPHIC ATTACH CB.HNDL, 100, REDRAW
            GRAPHIC COLOR %BLACK, -1
            GRAPHIC CLEAR
            FOR i = 0 TO %HLTdelta*5 STEP %HLTdelta
                GRAPHIC SET POS (i+5, 5)
                GRAPHIC PRINT FORMAT$(i/%HLTdelta, "0");":"
                SELECT CASE i/%HLTdelta
                    CASE 0 : c = %WHITE
                    CASE 1 : c = %CYAN
                    CASE 2 : c = %GREEN
                    CASE 3 : c = %MAGENTA
                    CASE 4 : c = %YELLOW
                END SELECT
                GRAPHIC BOX (i+15, 0) - (i+35, 20),, RGB(201,201,201), c
                IF i = 0 THEN
                    GRAPHIC COLOR RGB(200,0,0), -1
                    GRAPHIC WIDTH 3
                    GRAPHIC LINE (i+15, 20) - (i+35, 0)
                    GRAPHIC WIDTH 1
                    GRAPHIC COLOR %BLACK, -1
                END IF
            NEXT
            GRAPHIC REDRAW
            ' Subclass edit control
            CONTROL HANDLE CB.HNDL, 102 TO hEdit
            OldHLTProc = SETWINDOWLONG(hEdit, %GWL_WNDPROC, CODEPTR(HLTProc))
            CONTROL SET FOCUS CB.HNDL, 102

        CASE %WM_COMMAND
            ' Process control notifications
            IF CB.CTL = %IDCANCEL THEN DIALOG END CB.HNDL, 0

    END SELECT
END FUNCTION
'--------------------------------------------------------------------------------

'--------------------------------------------------------------------------------
FUNCTION ShowHighlight(BYVAL hParent AS DWORD) AS LONG
    LOCAL lRes  AS LONG
    LOCAL hDlg  AS DWORD
    LOCAL hEdit AS DWORD
    LOCAL hIco  AS DWORD

    DIALOG NEW hParent, "Highlight line", , , %HLTdelta*5+4, 32, %WS_POPUP OR _
        %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR _
        %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR _
        %DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_WINDOWEDGE OR _
        %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _
        %WS_EX_RIGHTSCROLLBAR, TO hDlg

    hIco = ExtractIcon(GetModuleHandle(""), "shell32.dll", 133)
    SetClassLong(hDlg, %GCL_HICONSM, hIco)
    SetClassLong(hDlg, %GCL_HICON, hIco)
    ClipBoardHtmlSet hParent, ""

    CONTROL ADD GRAPHIC, hDlg, 100, "", 2, 7, %HLTdelta*5, 20
    CONTROL ADD TEXTBOX, hDlg, 102, "", -1, -1, 0, 0

    DIALOG SHOW MODAL hDlg, CALL ProcHighlight TO lRes
    FUNCTION = lRes
END FUNCTION
'--------------------------------------------------------------------------------