Announcement

Collapse

Forum Guidelines

This forum is for finished source code that is working properly. If you have questions about this or any other source code, please post it in one of the Discussion Forums, not here.
See more
See less

WebClip PB-Forum/Clipboard utility

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • WebClip PB-Forum/Clipboard utility

    WebClip 1.4 by Pierre Bellisle 2005/02/20
    Thanks to: Semen Matusovski, Dave Navarro and Borje Hagsten and Edwin Knoppert

    WebClip is another flavor of the Semen Matusovski Forum/Clipboard utility
    witch provide capability to COPY and PASTE directly from the PB-Forums.
    This one will detect if the COPY was made from PB-Forum in Internet Explorer
    and reformat the clipboard if so, allowing you to paste in any editor.

    '------------------------------------------------------------------------------------
    'Version 1.4
    '1) Corected missing clipboard action when used under Windows NT/2000/XP
    '2) Removed web address from clipboard
    ------------------------------------------------------------------------------------
    Version 1.3
    1) Valid conversion of characters greater than CHR$(127)
    2) Corected double clipboard action when used under Windows NT/2000/XP
    3) Post web address added to clipboard
    4) Added a view window for HTML & Formatted text
    ------------------------------------------------------------------------------------
    Version 1.2
    1) Better reformatting.
    ------------------------------------------------------------------------------------
    Version 1.1
    1) Sound support: Copy a WAV file to the WebClipb folder and rename it WebClip.Wav,
    if you want HTML reformat sound confirmation.
    2) More solid way for finding the app. that was active before a WebClip reformat,
    now eliminating TOPMOST windows.
    (WebClip will do reformat only if PREVious app. is Internet Explorer at PowerBasic)
    3) Blank line are not removed anymore.
    ------------------------------------------------------------------------------------

    Pierre

    Code:
     
    #COMPILE EXE "WebClip.Exe" '#Win 7.04#
    #DIM ALL
    #REGISTER NONE
    #INCLUDE  "Win32Api.Inc" '# 2005-01-14 #
    #RESOURCE "WEBCLIP.PBR"
     
    $AppTitle          = "WebClip"
    $AppVer            = "1.4"
    $PB                = "http://www.powerbasic.com/"
    $SupFor            = "support/forums/"
    $CGI               = "forumdisplay.cgi?action=topics&"
     
    %PopUpEnd          = 200
    %PopUpDisable      = 201
    %PopUpEnable       = 202
    %PopUpAbout        = 203
     
    %PopUpFPower       = 300
    %PopUpFMain        = 301
    %PopUpFConsole     = 302
    %PopUpFDOS         = 303
    %PopUpFWindows     = 304
    %PopUpFProgramming = 305
    %PopUpFInternet    = 306
    %PopUpFSource      = 307
    %PopUpFThirdParty  = 308
    %PopUpFJob         = 309
    %PopUpFCafe        = 310
    %PopUpFWinApi      = 311
    %PopUpFMsg1999     = 312
    %PopUpFMsg1998     = 313
    %PopUpFSrcCode     = 314
    %PopUpTextbox      = 315
     
    %ButtonExit        = 401
    %ButtonTop         = 402
     
    %Textbox1          = 501
    %Textbox2          = 502
     
    %WM_TRAYICON       = 501 + %WM_USER
     
    GLOBAL hTextbox    AS DWORD
    '______________________________________________________________________________
     
    CALLBACK FUNCTION TextboxProc
     LOCAL SizeFactor AS LONG
     LOCAL isTop      AS LONG
     
     SELECT CASE CBMSG
     
       CASE %WM_COMMAND
         SELECT CASE LOWRD(CBWPARAM)
     
           CASE %ButtonExit
             IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1  THEN
               DIALOG END CBHNDL
             END IF
     
           CASE %ButtonTop
             IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1  THEN
               CONTROL SEND hTextbox, %ButtonTop, %BM_GETCHECK, 0, 0  TO isTop
               IF isTop  THEN
                 SetWindowPos hTextbox, %HWND_TOPMOST, 0, 0, 0, 0, %SWP_NOSIZE OR %SWP_NOMOVE
               ELSE
                 SetWindowPos hTextbox, %HWND_NOTOPMOST, 0, 0, 0, 0, %SWP_NOSIZE OR %SWP_NOMOVE
               END IF
             END IF
     
         END SELECT
     
       CASE %WM_DESTROY
         hTextbox = 0
     
       CASE %WM_SIZE  'Windows is resized
         IF CBWPARAM <> %SIZE_MINIMIZED THEN
           SizeFactor = HIWRD(CBLPARAM) \ 2
           MoveWindow GetDlgItem(CBHNDL, %Textbox1), 5, 27, LOWRD(CBLPARAM) - 10, SizeFactor - 30, %TRUE
           MoveWindow GetDlgItem(CBHNDL, %Textbox2), 5, SizeFactor, LOWRD(CBLPARAM) - 10, SizeFactor - 5, %TRUE
           FUNCTION = 0
           EXIT FUNCTION
         END IF
     
      END SELECT
     
    END FUNCTION
    '______________________________________________________________________________
     
    FUNCTION TextboxDual(Parent AS DWORD)AS LONG
     
     DIALOG NEW Parent ,$AppTitle & " - viewer", , , 400, 300, _
                  %WS_VISIBLE OR %WS_CLIPSIBLINGS OR %WS_CAPTION OR %WS_CLIPCHILDREN OR _
                  %WS_SYSMENU OR %WS_THICKFRAME OR %WS_MINIMIZEBOX OR _
                  %WS_MAXIMIZEBOX, %WS_EX_WINDOWEDGE TO hTextbox 
     
     CONTROL ADD BUTTON, hTextbox, %ButtonExit, "&Exit", 3, 2, 50, 12, _
                         %WS_CHILD OR %WS_VISIBLE OR %BS_PUSHBUTTON OR %WS_TABSTOP
     
     CONTROL ADD BUTTON, hTextbox, %ButtonTop, "&Topmost", 65, 2, 50, 12, _
                         %WS_CHILD OR %WS_VISIBLE OR %BS_AUTOCHECKBOX OR %BS_PUSHLIKE OR %WS_TABSTOP
     
     CONTROL ADD TEXTBOX, hTextbox, %Textbox1, "HTML Format",  5,  27, 390, 140 , _
                          %WS_CHILD OR %WS_VISIBLE OR %WS_VSCROLL OR %ES_READONLY OR _
                          %WS_TABSTOP OR %ES_MULTILINE OR %ES_AUTOVSCROLL, %WS_EX_CLIENTEDGE
     
     CONTROL SEND hTextbox, %Textbox1, %WM_SETFONT, GetStockObject(%ANSI_FIXED_FONT), %TRUE
     
     CONTROL ADD TEXTBOX, hTextbox, %Textbox2, "Formatted text",  5, 150, 390, 140, _
                          %WS_CHILD OR %WS_VISIBLE OR %WS_VSCROLL OR %ES_READONLY OR _
                          %WS_TABSTOP OR %ES_MULTILINE OR %ES_WANTRETURN OR _
                          %ES_AUTOVSCROLL, %WS_EX_CLIENTEDGE
     
     CONTROL SEND hTextbox, %Textbox2, %WM_SETFONT, GetStockObject(%ANSI_FIXED_FONT), %TRUE
     
     DIALOG SHOW MODAL hTextbox CALL TextboxProc
     
    END FUNCTION
    '______________________________________________________________________________
     
    FUNCTION ChildTextGet(hChild AS DWORD) AS STRING
     LOCAL sText   AS STRING
     LOCAL Textlen AS LONG
     
     Textlen = SendMessage(hChild, %WM_GETTEXTLENGTH, 0, 0)
     IF Textlen THEN
       sText = STRING$(Textlen + 1, 0)
       Textlen = SendMessage(hChild, %WM_GETTEXT, Textlen, STRPTR(sText))
       FUNCTION = LEFT$(sText, Textlen)
     END IF
     
    END FUNCTION
    '______________________________________________________________________________
     
    FUNCTION IsWinNT() AS LONG
      LOCAL OsVI AS OSVERSIONINFO
     
      OsVI.dwOSVersionInfoSize = SIZEOF(OsVI)
      GetVersionEx OsVI
      IF OsVI.dwPlatformId = %VER_PLATFORM_WIN32_NT THEN FUNCTION = 1
     
    END FUNCTION
    '______________________________________________________________________________
     
    FUNCTION FileExist(FILENAME AS STRING) AS INTEGER
     
     FileExist = (DIR$(FILENAME, %ATTR_READONLY OR %ATTR_HIDDEN OR %ATTR_SYSTEM) <> "")
     
    END FUNCTION
    '______________________________________________________________________________
     
    FUNCTION WavName () AS STRING
     LOCAL szFileName       AS ASCIIZ * %Max_Path
     LOCAL  FILENAME        AS STRING
     LOCAL  LenFileName     AS LONG
     
     LenFileName = GetModuleFileName(0, szFileName, %Max_Path)
     FUNCTION = LEFT$(szFileName, LenFileName- 3) & "WAV"
     
    END FUNCTION
    '______________________________________________________________________________
     
    FUNCTION hieGet() AS DWORD
     LOCAL hTry      AS DWORD
     LOCAL zText     AS ASCIIZ * 1024
     LOCAL LenText   AS LONG
     
     hTry = GETFOREGROUNDWINDOW() 
     IF isWIndowVisible(hTry) THEN
       LenText = GetWindowText(hTry, zText, SIZEOF(zText))  
       IF INSTR(zText, "Microsoft Internet Explorer") THEN
         IF INSTR(zText, "PowerBASIC") THEN
           FUNCTION = hTry
         END IF
       END IF
     END IF 
     
    END FUNCTION
    '______________________________________________________________________________
     
    FUNCTION RemoveHtml(BYVAL Buf AS STRING) AS STRING
     LOCAL SourceURL      AS STRING
     LOCAL Topic          AS STRING
     LOCAL k1             AS LONG
     LOCAL k2             AS LONG
     LOCAL LenBuf         AS LONG
     LOCAL SelectionStart AS LONG
     LOCAL SelectionEnd   AS LONG
     REGISTER k           AS LONG
     
     LenBuf = LEN(Buf) : IF LenBuf < 1 THEN EXIT FUNCTION
     
     k1 = INSTR(Buf, "SourceURL:") + 10
     k2 = INSTR(k1, Buf, $CRLF)
     SourceURL = MID$(Buf, k1, k2 - k1) 
     
     k1 = INSTR(Buf, "<TITLE>") + 7
     k2 = INSTR(k1, Buf, "</TITLE>") - 20
     Topic = MID$(Buf, k1, k2 - k1) 
     
     k1 = INSTR(Buf, "StartSelection:") + 15
     k2 = INSTR(k1, Buf, $CRLF)
     SelectionStart = 1 + VAL(MID$(Buf, k1, k2 - k1)) 
     k1 = INSTR(Buf, "EndSelection:") + 15
     k2 = INSTR(k1, Buf, $CRLF)
     SelectionEnd = 1 + VAL(MID$(Buf, k1, k2 - k1)) 
     
     buf = MID$(buf, SelectionStart, SelectionEnd - SelectionStart)
     LenBuf = LEN(Buf): IF LenBuf < 1 THEN EXIT FUNCTION
     DIM bBuf(0 TO LenBuf - 1) AS BYTE AT STRPTR(Buf)
     
     k1 = 1
     DO  'Delete  <- Java ->
       IF k1 > LenBuf THEN EXIT DO
       k2 = INSTR(k1, Buf, "<-"): IF k2 = 0 THEN EXIT DO
       k1 = INSTR(k2 + 2, Buf, "->")
       IF k1 = 0 THEN k1 = LenBuf + 1 ELSE k1 = k1 + 2
       FOR k = k2 - 1 TO k1 - 2: bBuf(k) = 0: NEXT:
     LOOP
     
     FOR k = 0 TO LenBuf - 1 'Remove all CrLf
       IF bBuf(k) = 13 AND bBuf(k + 1) = 10 THEN
         bBuf(k) = 0 : bBuf(k + 1) = 0
       END IF
     NEXT
     
     k1 = 1 
     DO 'Convert extended characters above 127
       IF k1 > LenBuf THEN EXIT DO
       k2 = INSTR(k1, Buf, CHR$(195)): IF k2 = 0 THEN EXIT DO
       MID$(buf, k2, 1) = $NUL
       MID$(buf, k2 + 1, 1) = CHR$( ASC(MID$(buf, k2 + 1, 1)) + 64)
       k1 = k2 + 2
     LOOP
     
     'Check if any "¤" in text
     FOR k = 0 TO LenBuf - 1
      IF bBuf(k) = 194 AND bBuf(k + 1) = 164 THEN
        bBuf(k) = 0
      END IF
     NEXT
     
     k1 = 1
     DO ' Replace tags, <P> <BR> <HTML> </HEAD> </HTML>
       IF k1 > LenBuf THEN EXIT DO
       k2 = INSTR(k1, Buf, "<"): IF k2 = 0 THEN EXIT DO
       k = k2 - 1
       DO
         DECR k: IF k < 0 THEN EXIT DO
         IF (bBuf(k) = 32) THEN
           EXIT DO
         ELSEIF bBuf(k) THEN
           bBuf(k + 1) = 32: EXIT DO
         END IF
       LOOP
       k1 = INSTR(k2 + 1, Buf, ">"): IF k1 = 0 THEN k1 = LenBuf
       SELECT CASE UCASE$(MID$(Buf$, k2 + 1, k1 - k2 - 1))
         CASE "BR"            : bBuf(k2 - 1) = 13 : bBuf(k2) = 10 : k2 = k2 + 2
         CASE "P"             : bBuf(k2 - 1) = 1  : bBuf(k2) = 1  : k2 = k2 + 2 'CHR$(1) will become $CRLF
         CASE "HTML", "/HEAD" : k2 = 1
         CASE "/HTML"         : k1 = LenBuf
       END SELECT
       INCR k1 : FOR k = k2 - 1 TO k1 - 2 : bBuf(k) = 0 : NEXT
     LOOP
     
     k1 = 1
     DO ' Replace, &NBSP; > < &
       IF k1 > LenBuf THEN EXIT DO
       k2 = INSTR(k1, Buf, "&")
       IF k2 = 0 THEN EXIT DO
       k1 = INSTR(k2 + 1, Buf, ";")
       IF k1 = 0 THEN EXIT DO
       SELECT CASE UCASE$(MID$(Buf$, k2 + 1, k1 - k2 - 1))
         CASE "NBSP" : bBuf(k2 - 1) = 32: INCR k2 '  space
         CASE "GT"   : bBuf(k2 - 1) = 62: INCR k2 '> greater than
         CASE "LT"   : bBuf(k2 - 1) = 60: INCR k2 '< less than
         CASE "AMP"  : INCR k2                    '& ampersand
         CASE ELSE   : k2 = 0
       END SELECT
       IF k2 THEN FOR k = k2 - 1 TO k1 - 1: bBuf(k) = 0: NEXT
       INCR k1
     LOOP
     
     k1 = 0  'Remove CFR$(0) from buf
     FOR k = 0 TO LenBuf - 1
       IF bBuf(k) THEN bBuf(k1) = bBuf(k): INCR k1
     NEXT
     Buf = RTRIM$(LEFT$(Buf, k1))
     
     REPLACE CHR$(&hC2, &hA0, &hC2, &hA0, &hC2, &hA0) WITH $CRLF IN Buf
     REPLACE CHR$(&hC2, &hA0) WITH "" IN Buf
     REPLACE CHR$(1) WITH $CRLF IN Buf
     
     'Buf = "'" & SourceURL & $CRLF & "'" & Topic & $CRLF  & $CRLF & Buf
     
     FUNCTION = Buf
     
    END FUNCTION
    '______________________________________________________________________________
     
    FUNCTION WriteToClipBoard(BYVAL Txt AS STRING) AS LONG
     LOCAL MemPointer AS ASCIIZ PTR
     LOCAL hMem       AS DWORD
     
     hMem = GlobalAlloc(%GHND, LEN(Txt) + 1)
     MemPointer = GlobalLock(hMem)          
     @MemPointer = Txt                      
     GlobalUnlock hMem                      
     OpenClipboard 0
     EmptyClipboard
     SetClipboardData %CF_TEXT, hMem        
     CloseClipboard
     GlobalFree(hMem)
     FUNCTION = 1
     
    END FUNCTION
    '______________________________________________________________________________
     
    FUNCTION DoClipBoard() AS LONG
     LOCAL  ClipFormat   AS LONG
     STATIC HtmlFormat AS LONG
     LOCAL  hBuffer    AS ASCIIZ PTR
     LOCAL  Buffer     AS STRING
     
     OpenClipboard 0
     IF HtmlFormat = 0 THEN HtmlFormat = RegisterClipboardFormat("HTML Format")
     DO
       ClipFormat = EnumClipboardFormats(ClipFormat)
       IF ClipFormat = 0 THEN  EXIT DO
       IF ClipFormat = HtmlFormat THEN
         hBuffer = GetClipboardData(HtmlFormat)
         IF hBuffer THEN Buffer = @hBuffer : EXIT DO
       END IF
     LOOP
     CloseClipboard
     IF FileExist(WavName) THEN SndPlaySound WavName, %SND_SYNC
     IF hTextbox THEN CONTROL SET TEXT hTextbox, %Textbox1, Buffer
     Buffer = RemoveHTML(Buffer)
     IF LEN(Buffer) THEN
       WriteToClipBoard Buffer
       IF hTextbox THEN CONTROL SET TEXT hTextbox, %Textbox2, Buffer
     END IF
     
    END FUNCTION
    '______________________________________________________________________________
     
    CALLBACK FUNCTION DlgProc
     STATIC nfIconData       AS NOTIFYICONDATA
     LOCAL  pt               AS POINTAPI
     LOCAL  WebAddr          AS ASCIIZ * 200
     LOCAL  RetVal           AS LONG
     STATIC ClipDrawing      AS LONG
     STATIC ConversionEnable AS LONG
     LOCAL  hie              AS DWORD
     STATIC hInstance        AS DWORD
     STATIC hIcon            AS DWORD
     STATIC hClipboardChain  AS DWORD
     STATIC hPopup           AS DWORD
     STATIC nAtom            AS DWORD
     
     
     SELECT CASE CBMSG
       CASE %WM_INITDIALOG
         ConversionEnable            = 1
         hClipboardChain             = SetClipboardViewer(CBHNDL)
         hInstance                   = GetModuleHandle(BYVAL 0&)
         hIcon                       = LoadIcon(hInstance, "CLIPICON")
         nfIconData.hwnd             = CBHNDL
         nfIconData.uID              = hInstance
         nfIconData.uFlags           = %NIF_ICON OR %NIF_MESSAGE OR %NIF_TIP
         nfIconData.uCallbackMessage = %WM_TRAYICON
         nfIconData.hIcon            = hIcon
         nfIconData.szTip            = $AppTitle
         nfIconData.cbSize           = SIZEOF(nfIconData)
         Shell_NotifyIcon %NIM_ADD, nfIconData
     
         MENU NEW POPUP TO hPopup  'a b c d e f i j l m o p q r s t v w 8 9
         MENU ADD STRING, hPopup, "&Power&Basic", %PopUpFPower,       %MF_ENABLED
         MENU ADD STRING, hPopup, "&Main",        %PopUpFMain,        %MF_ENABLED
         MENU ADD STRING, hPopup, "-",            0,                  %MF_ENABLED
         MENU ADD STRING, hPopup, "&Console",     %PopUpFConsole,     %MF_ENABLED
         MENU ADD STRING, hPopup, "&DOS",         %PopUpFDOS,         %MF_ENABLED
         MENU ADD STRING, hPopup, "&Windows",     %PopUpFWindows,     %MF_ENABLED
         MENU ADD STRING, hPopup, "Prog&ramming", %PopUpFProgramming, %MF_ENABLED
         MENU ADD STRING, hPopup, "&Internet",    %PopUpFInternet,    %MF_ENABLED
         MENU ADD STRING, hPopup, "&Source",      %PopUpFSource,      %MF_ENABLED
         MENU ADD STRING, hPopup, "&Third-Party", %PopUpFThirdParty,  %MF_ENABLED
         MENU ADD STRING, hPopup, "&Job",          %PopUpFJob,        %MF_ENABLED
         MENU ADD STRING, hPopup, "Ca&fé",         %PopUpFCafe,       %MF_ENABLED
         MENU ADD STRING, hPopup, "Win&Api",      %PopUpFWinApi,      %MF_ENABLED
         MENU ADD STRING, hPopup, "-",            0,                  %MF_ENABLED
         MENU ADD STRING, hPopup, "Msg 199&8",    %PopUpFMsg1998,     %MF_ENABLED
         MENU ADD STRING, hPopup, "Msg 199&9",    %PopUpFMsg1999,     %MF_ENABLED
         MENU ADD STRING, hPopup, "SrcC&ode",     %PopUpFSrcCode,     %MF_ENABLED
         MENU ADD STRING, hPopup, "-",            0,                  %MF_ENABLED
         MENU ADD STRING, hPopup, "A&bout",       %PopUpAbout,        %MF_ENABLED
         MENU ADD STRING, hPopup, "-",            0,                  %MF_ENABLED
         MENU ADD STRING, hPopup, "&Enable",      %PopUpEnable,       %MF_ENABLED OR %MF_CHECKED
         MENU ADD STRING, hPopup, "Disab&le",     %PopUpDisable,      %MF_ENABLED
         MENU ADD STRING, hPopup, "-",            0,                  %MF_ENABLED
         MENU ADD STRING, hPopup, "&View",        %PopUpTextbox,      %MF_ENABLED
         MENU ADD STRING, hPopup, "-",            0,                  %MF_ENABLED
         MENU ADD STRING, hPopup, "&Quit",        %PopUpEnd,          %MF_ENABLED
     
         PostMessage CBHNDL, %WM_USER + 500, 0, 0
     
       CASE %WM_USER + 500
         ShowWindow CBHNDL, %SW_HIDE  'Hide windows in taskbar
     
       CASE %WM_DESTROY
         GlobalDeleteAtom nAtom
         Shell_NotifyIcon %NIM_DELETE, nfIconData
         ChangeClipboardChain CBHNDL, hClipboardChain
         PostMessage hTextbox, %WM_SYSCOMMAND, %SC_CLOSE, 0
         PostQuitMessage 0
     
       CASE %WM_DRAWCLIPBOARD 'Here we know the clipboard content is beeing updated by Ctrl-C or Control-Insert
         IF ISFALSE(ClipDrawing) THEN
           ClipDrawing = 1
           IF ConversionEnable THEN
             hie = hieGet
             IF hie THEN
               DoClipboard
             END IF
           END IF      
           END IF      
         SendMessage hClipboardChain, CBMSG, CBWPARAM, CBLPARAM 'Forward data to next clipboard chain
         FUNCTION = 1
         ClipDrawing = 0
     
       CASE %WM_TRAYICON
         SELECT CASE LOWRD(CBLPARAM)
           CASE %WM_LBUTTONUP, %WM_RBUTTONUP
             GetCursorPos pt
             SetForegroundWindow CBHNDL
             TrackPopupMenu hPopup, %TPM_RightALIGN OR %TPM_BOTTOMALIGN OR %TPM_RIGHTBUTTON, pt.x, pt.y, 0, CBHNDL, BYVAL 0
             FUNCTION = 1
         END SELECT
         FUNCTION = 1
     
       CASE %WM_COMMAND
         SELECT CASE LOWRD(CBWPARAM)
     
           CASE %PopUpTextbox
             IF hTExtbox THEN
               SetWindowPos hTExtbox, %HWND_TOP, 0,0,0,0, %SWP_NOMOVE OR %SWP_NOSIZE 
               EnableWindow hTExtbox, 1 
               IF IsIconic(hTExtbox) THEN ShowWindow hTExtbox, %SW_RESTORE ELSE ShowWindow hTExtbox, %SW_SHOW
               IF GETFOREGROUNDWINDOW() <> hTextbox THEN
                 ShowWindow hTExtbox, %SW_MINIMIZE
                 ShowWindow hTExtbox, %SW_RESTORE
               END IF
             ELSE
               TextboxDual CBHNDL
             END IF
     
           CASE %PopUpAbout
             MessageBox CBHNDL, $AppTitle & $SPC & $AppVer & " by Pierre Bellisle 2001-2005" & $CRLF & _
                        "Thanks to: Dave Navarro, Semen Matusovski  and Borje Hagsten." & $CRLF & _
                        $AppTitle & " will reformat the clipboard when you Copy & Paste from the" & $CRLF & _
                        "PB-Forum in Internet Explorer to your editor."  & $CRLF, _
                        $AppTitle & $SPC & $AppVer, %MB_ICONINFORMATION OR %MB_OK
     
           CASE %PopUpDisable
             ConversionEnable = 0
             CheckMenuItem hPopUp, %PopUpDisable, %MF_CHECKED
             CheckMenuItem hPopUp, %PopUpEnable,  %MF_UnCHECKED
     
           CASE %PopUpEnable
             ConversionEnable = 1
             CheckMenuItem hPopUp, %PopUpDisable, %MF_UnCHECKED
             CheckMenuItem hPopUp, %PopUpEnable,  %MF_CHECKED
     
           CASE %PopUpEnd
             DIALOG END CBHNDL
     
           CASE %PopUpFPower
             WebAddr = $PB
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
           CASE %PopUpFMain
             WebAddr = $PB & $SupFor & "Ultimate.cgi"
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
           CASE %PopUpFConsole
             WebAddr = $PB & $SupFor & $CGI & "forum=PowerBASIC+Console+Compiler&number=5&DaysPrune=20&LastLogin="
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
           CASE %PopUpFDOS
             WebAddr = $PB & $SupFor & $CGI & "forum=PowerBASIC+for+DOS&number=3&DaysPrune=20&LastLogin="
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
           CASE %PopUpFWindows
             WebAddr = $PB & $SupFor & $CGI & "forum=PowerBASIC+for+Windows&number=4&DaysPrune=20&LastLogin="
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
           CASE %PopUpFProgramming
             WebAddr = $PB & $SupFor & $CGI & "forum=Programming&number=6&DaysPrune=20&LastLogin="
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
           CASE %PopUpFInternet
             WebAddr = $PB & $SupFor & $CGI & "forum=Programming+the+Internet&number=9&DaysPrune=20&LastLogin="
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
           CASE %PopUpFSource
             WebAddr = $PB & $SupFor & $CGI & "forum=Source+Code&number=7&DaysPrune=20&LastLogin="
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
           CASE %PopUpFThirdParty
             WebAddr = $PB & $SupFor & $CGI & "forum=Third-Party+Addons&number=8&DaysPrune=20&LastLogin="
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
           CASE %PopUpFJob
             WebAddr = $PB & $SupFor & $CGI & "forum=Positions+Wanted/Offered&number=11&DaysPrune=20&LastLogin="
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
           CASE %PopUpFCafe
             WebAddr = $PB & $SupFor & $CGI & "forum=Cafe+PowerBASIC&number=12&DaysPrune=20&LastLogin="
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
           CASE %PopUpFWinApi
             WebAddr = $PB & "files/pub/pbwin/"
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
           CASE %PopUpFMsg1999
             WebAddr = $PB & $SupFor & $CGI & "number=A%3A000003&SUBMIT=Go"
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
           CASE %PopUpFMsg1998
             WebAddr = $PB & $SupFor & $CGI & "number=A%3A000001&SUBMIT=Go"
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
           CASE %PopUpFSrcCode
             WebAddr = $PB & $SupFor & $CGI & "number=A%3A000002&SUBMIT=Go"
             RetVal = ShellExecute(%NULL, "OPEN", WebAddr, "", CURDIR$, %SW_SHOWNORMAL)
     
         END SELECT
         FUNCTION =1
     
     END SELECT
     
    END FUNCTION
    '______________________________________________________________________________
     
    FUNCTION PBMAIN
     LOCAL hDlg    AS DWORD
     LOCAL szMutex AS ASCIIZ * 9
     LOCAL hMutex  AS DWORD
     
     DIALOG NEW 0, $AppTitle, 0, 0, 0, 0, %WS_POPUP, %WS_EX_TOPMOST OR %WS_EX_TOOLWINDOW TO hDlg
     
     SetClassLong hDlg, %GCL_HICON, LoadIcon(GetModuleHandle(BYVAL 0&), "ClipIcon") '%MYICON)
     
     szMutex = $AppTitle
     hMutex = CreateMutex(BYVAL %NULL, 0, szMutex)
     IF hMutex = %NULL OR GetLastError = %ERROR_ALREADY_EXISTS THEN
       MessageBox hDlg, $AppTitle & " is already running!" & $CRLF & _
                        "Please click on the clipboard icon in the taskbar!", _
                        $AppTitle, %MB_ICONEXCLAMATION OR %MB_OK
       EXIT FUNCTION
     END IF
     
     DIALOG SHOW MODAL hDlg CALL DlgProc
     
     CloseHandle hMutex
     
    END FUNCTION
    '______________________________________________________________________________


    [This message has been edited by Pierre Bellisle (edited October 04, 2006).]

  • #2
    // WebClip.rc

    Code:
    #include "resource.h"
     
    ClipIcon ICON CLIPBLUE.ICO
     
    VS_VERSION_INFO VERSIONINFO
    FILEVERSION 1, 4, 0, 0
    PRODUCTVERSION 1, 4, 0, 0
    FILEOS VOS_WINDOWS32
    FILETYPE VFT_APP
    BEGIN
      BLOCK "StringFileInfo"
      BEGIN
        BLOCK "040904E4"
        BEGIN
          VALUE "CompanyName",      "Pierre Bellisle\000"
          VALUE "FileDescription",  "Clipboard utility\000"
          VALUE "FileVersion",      "1.40.00.00\000"
          VALUE "InternalName",     "WebClip.Exe\000"
          VALUE "OriginalFilename", "WebClip.Exe\000"
          VALUE "LegalCopyright",   "No Copyright, it's free\000"
          VALUE "LegalTrademarks",  "No Copyright, it's free\000"
          VALUE "ProductName",      "WebClip\000"
          VALUE "ProductVersion",   "1.40.000\000"
          VALUE "Comments",         "Remove HTML code from PB-Forum.\000"
        END
      END
    END
    [This message has been edited by Pierre Bellisle (edited February 20, 2005).]

    Comment


    • #3
      Code:
      'This file will generate an icon named ClipBlue.ico
       
      'Thank to Edwin for BinBas GUI 2.02
       
      #COMPILE EXE '#Win 704#             
      #REGISTER NONE                      
      #DIM ALL                            
      #INCLUDE "Win32Api.Inc" '2005-01-14
      '______________________________________________________________________________
       
      FUNCTION BinBas() AS STRING
       
       FUNCTION = PEEK$(CODEPTR(BinBas_Data), 766)
       EXIT FUNCTION
       
       BinBas_Data:
       !db 000,000,001,000,001,000,032,032,004,000,000,000,000,000,232,002,000,000
       !db 022,000,000,000,040,000,000,000,032,000,000,000,064,000,000,000,001,000
       !db 004,000,000,000,000,000,000,002,000,000,000,000,000,000,000,000,000,000
       !db 000,000,000,000,000,000,000,000,000,000,000,000,000,000,128,000,000,128
       !db 000,000,000,128,128,000,128,000,000,000,128,000,128,000,128,128,000,000
       !db 192,192,192,000,128,128,128,000,000,000,255,000,000,255,000,000,000,255
       !db 255,000,255,000,000,000,255,000,255,000,255,255,000,000,255,255,255,000
       !db 000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,204
       !db 000,000,000,000,000,000,000,000,000,000,000,012,192,000,012,000,192,000
       !db 000,000,000,000,000,000,000,000,000,192,012,000,012,000,140,000,000,000
       !db 000,000,000,000,000,000,012,000,012,000,012,012,008,192,000,000,000,000
       !db 000,000,000,000,192,124,012,000,012,012,192,140,000,000,000,000,000,000
       !db 000,012,007,204,012,000,012,012,012,008,192,000,000,000,000,000,000,192
       !db 124,012,012,000,012,012,000,192,140,000,000,000,000,000,012,007,192,012
       !db 012,000,012,012,000,012,008,192,000,000,000,000,192,124,000,012,012,000
       !db 012,012,000,000,192,140,000,000,000,012,007,192,000,012,012,000,012,012
       !db 000,000,012,008,192,000,000,192,124,000,000,012,012,000,012,012,000,000
       !db 000,192,140,000,012,007,192,000,000,012,012,000,012,012,000,000,000,012
       !db 008,192,192,124,000,000,000,012,012,000,012,012,000,000,000,000,192,140
       !db 007,192,000,000,000,012,012,000,012,008,204,000,000,000,012,192,124,000
       !db 000,000,012,192,012,000,000,204,008,204,000,000,012,007,204,000,000,012
       !db 192,124,192,000,000,000,204,008,204,000,192,124,008,192,012,192,124,192
       !db 000,000,000,000,000,204,008,204,007,192,192,140,192,124,192,000,000,000
       !db 000,000,000,000,204,192,124,000,012,192,124,192,000,000,000,000,000,000
       !db 000,000,012,007,200,192,192,124,204,000,000,000,000,000,000,000,000,000
       !db 192,124,204,000,012,204,136,192,000,000,000,000,000,000,000,012,007,192
       !db 000,000,000,000,192,140,000,000,000,000,000,000,000,192,124,000,000,000
       !db 000,000,012,008,192,000,000,000,000,000,012,007,192,000,000,000,000,000
       !db 000,192,140,000,000,000,000,000,192,124,000,000,000,000,000,000,000,012
       !db 008,192,000,000,000,012,007,192,000,000,000,000,000,000,000,000,192,140
       !db 000,000,000,192,124,000,000,000,000,000,000,000,000,000,012,008,192,000
       !db 012,007,192,000,000,000,000,000,000,000,000,000,000,192,140,000,192,124
       !db 000,000,000,000,000,000,000,000,000,000,000,012,008,192,192,007,204,204
       !db 204,204,204,204,204,204,204,204,204,192,000,192,012,000,000,000,000,000
       !db 000,000,000,000,000,000,000,000,012,000,000,204,204,204,204,204,204,204
       !db 204,204,204,204,204,204,192,000,255,255,255,255,207,255,255,231,183,255
       !db 255,219,179,255,255,187,169,255,255,075,164,255,254,139,170,127,253,043
       !db 173,063,250,107,174,159,244,235,175,079,233,235,175,167,211,235,175,211
       !db 167,235,175,233,079,235,175,244,159,235,163,249,063,155,200,250,062,071
       !db 242,052,153,031,252,137,068,127,255,019,145,255,255,161,067,255,255,067
       !db 129,255,254,159,244,255,253,063,250,127,250,127,253,063,244,255,254,159
       !db 233,255,255,079,211,255,255,167,167,255,255,211,079,255,255,233,096,000
       !db 000,029,191,255,255,251,192,000,000,007
       
      END FUNCTION
      '______________________________________________________________________________
       
      FUNCTION PBMAIN
       LOCAL FileNo AS LONG
       
       FileNo = FREEFILE
       OPEN "ClipBlue.ico" FOR OUTPUT AS #FileNo
       IF ERR THEN
         MessageBox 0, ByCopy "Error:" & STR$(ERR), _
                       ByCopy "ClipBlue.ico", %MB_ICONERROR OR %MB_OK
       ELSE
         PRINT #FileNo, BinBas;
         CLOSE #FileNo
         MessageBox 0, ByCopy  "Creation of ClipBlue.ico successfull !", _
                       ByCopy "ClipBlue.ico", %MB_ICONINFORMATION OR %MB_OK
       END IF
       
      END FUNCTION
      '______________________________________________________________________________

      Comment


      • #4
        Code:
        'This file will generate an wav file named WebClip.wav
         
        'Thank to Edwin for BinBas GUI 2.02
         
        #COMPILE EXE '#Win 704#
        #REGISTER NONE
        #DIM ALL
        #INCLUDE "Win32Api.Inc" '2005-01-14
        '______________________________________________________________________________
         
        FUNCTION BinBas() AS STRING
         
         FUNCTION = PEEK$( CODEPTR( BinBas_Data ), 1758 )
         EXIT FUNCTION
         
         BinBas_Data:
         !db 082,073,070,070,214,006,000,000,087,065,086,069,102,109,116,032,016,000
         !db 000,000,001,000,001,000,017,043,000,000,017,043,000,000,001,000,008,000
         !db 100,097,116,097,178,006,000,000,128,128,128,128,128,128,128,128,128,128
         !db 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128
         !db 128,128,126,128,128,128,128,128,128,128,128,128,128,128,126,126,128,126
         !db 128,128,128,128,126,128,126,128,128,128,128,128,126,126,126,126,126,126
         !db 126,126,128,126,128,128,128,128,128,126,126,128,128,128,128,128,128,128
         !db 128,128,128,128,128,128,128,128,128,128,128,128,126,128,128,128,128,128
         !db 128,128,128,128,128,128,126,126,128,128,126,126,126,128,128,128,128,128
         !db 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128
         !db 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128
         !db 126,126,126,128,128,128,128,128,128,128,130,130,128,126,124,124,124,126
         !db 126,126,126,128,130,134,136,134,130,126,122,118,116,118,120,122,124,126
         !db 130,136,140,142,144,140,130,122,118,114,110,108,114,118,124,132,136,144
         !db 148,148,142,136,128,124,118,116,114,112,112,116,122,126,128,136,144,144
         !db 138,132,128,124,120,118,116,118,124,126,126,130,134,134,132,130,130,134
         !db 136,134,128,122,120,118,118,118,122,124,126,130,132,134,140,146,142,138
         !db 130,120,114,108,104,110,116,122,130,138,146,146,144,136,128,122,118,114
         !db 114,112,112,114,114,120,126,136,144,146,152,156,144,142,124,106,091,081
         !db 085,095,124,156,181,187,171,165,142,098,073,067,067,089,132,163,177,183
         !db 171,136,110,091,073,067,089,126,150,171,187,177,146,122,108,110,104,093
         !db 095,114,128,146,158,167,163,152,152,148,124,093,083,085,083,083,106,136
         !db 134,150,148,122,124,144,154,136,134,132,130,132,120,095,095,108,126,152
         !db 169,175,152,118,095,093,100,114,138,146,134,140,138,110,085,098,124,130
         !db 150,171,177,142,110,102,100,095,093,132,171,179,161,165,130,100,093,053
         !db 061,114,114,152,187,171,140,110,106,093,106,122,140,156,161,136,126,148
         !db 108,077,108,140,154,156,144,130,100,114,148,158,152,138,120,091,091,095
         !db 102,124,165,165,156,130,089,081,102,087,075,095,146,187,167,154,161,136
         !db 120,104,091,122,161,189,158,142,150,120,091,067,073,106,136,148,148,165
         !db 167,152,122,120,120,132,100,083,081,122,177,197,124,095,102,073,057,087
         !db 175,211,185,136,077,059,081,110,154,193,213,230,191,118,075,059,079,085
         !db 120,134,126,148,189,167,120,106,093,093,089,083,126,173,201,181,167,148
         !db 108,077,063,112,175,181,165,108,077,059,067,071,112,181,230,217,181,140
         !db 091,041,018,075,104,165,185,213,223,124,037,012,037,059,120,187,217,228
         !db 189,116,075,081,083,093,158,223,230,201,150,098,071,114,124,138,108,083
         !db 110,118,122,142,175,161,126,110,102,083,091,110,136,158,195,171,120,059
         !db 026,065,122,161,175,191,142,061,043,065,089,146,201,221,187,124,061,047
         !db 024,049,114,199,252,242,185,095,018,000,010,063,124,165,213,230,189,132
         !db 087,053,047,067,122,173,211,213,195,163,102,041,020,047,112,142,161,191
         !db 181,158,118,098,077,081,114,136,158,169,161,152,152,142,138,124,079,061
         !db 079,150,179,150,116,106,100,104,106,156,175,171,183,181,150,108,071,063
         !db 071,095,140,185,195,209,201,138,075,020,008,051,132,211,242,215,156,100
         !db 081,067,077,112,140,167,179,183,183,171,134,112,087,059,049,083,154,209
         !db 217,197,183,144,065,014,014,077,154,183,213,234,209,122,047,035,063,098
         !db 120,165,199,205,150,083,065,077,091,104,118,146,165,179,171,161,156,136
         !db 104,089,112,126,126,122,136,158,138,114,118,128,128,116,091,093,112,140
         !db 152,171,183,158,116,087,079,085,116,140,154,152,148,130,120,120,100,093
         !db 118,136,126,118,118,120,158,167,138,128,122,100,095,120,142,140,122,104
         !db 095,110,134,150,158,152,136,130,114,083,081,108,144,154,161,156,142,116
         !db 098,100,112,134,126,095,108,132,136,136,156,154,114,081,095,108,093,091
         !db 138,181,179,142,116,102,093,087,093,126,171,183,167,130,104,087,102,112
         !db 124,161,154,144,132,102,087,104,110,104,128,138,136,136,161,163,152,128
         !db 098,085,091,104,122,140,163,161,150,136,108,083,067,087,142,175,171,163
         !db 158,128,098,089,098,110,120,148,165,148,112,100,104,106,118,140,169,173
         !db 158,134,106,077,057,079,116,132,148,171,187,181,154,128,093,071,081,091
         !db 100,112,112,126,156,173,175,169,154,130,104,104,104,100,112,120,126,134
         !db 150,156,154,148,140,120,104,093,089,110,130,144,152,156,142,140,134,128
         !db 116,110,114,138,154,142,112,093,100,108,118,150,175,171,167,134,106,081
         !db 077,098,124,140,144,154,152,150,146,138,118,100,106,112,128,138,136,138
         !db 132,122,120,122,122,130,138,136,146,150,138,116,108,106,114,124,136,154
         !db 158,152,124,095,091,114,126,130,144,156,152,152,146,126,106,098,095,106
         !db 124,140,152,163,148,122,124,120,112,112,126,126,128,146,158,148,148,140
         !db 118,093,087,104,124,138,142,146,142,124,122,120,130,130,132,142,134,124
         !db 120,124,128,132,122,128,136,132,122,110,100,104,112,120,136,140,154,173
         !db 167,142,114,093,089,102,110,116,138,152,150,132,128,122,106,108,124,128
         !db 122,130,140,138,132,124,124,126,132,136,134,130,118,112,112,110,114,122
         !db 134,140,142,148,146,132,112,104,114,120,122,124,132,134,128,128,128,126
         !db 130,134,134,134,132,124,120,116,114,106,106,116,118,126,138,142,142,148
         !db 142,126,118,122,124,122,124,128,128,124,120,114,114,118,126,136,132,134
         !db 140,138,128,120,114,112,114,116,122,132,140,140,134,130,128,128,124,124
         !db 124,118,122,130,128,120,118,120,124,128,134,136,136,134,136,132,120,116
         !db 120,126,126,126,126,126,126,126,128,132,132,130,128,128,122,120,120,120
         !db 120,128,134,138,138,132,128,124,122,120,122,126,126,130,138,138,126,114
         !db 114,122,128,126,128,132,130,124,120,122,126,126,128,134,134,132,128,124
         !db 118,116,120,124,128,132,132,130,130,128,122,120,122,124,126,126,126,128
         !db 132,134,132,128,124,128,128,124,122,120,124,124,124,126,128,128,128,128
         !db 130,128,128,130,128,128,126,122,122,124,122,122,126,130,134,134,132,128
         !db 126,126,126,124,126,128,128,126,124,124,126,128,128,130,136,134,126,124
         !db 124,122,122,124,128,130,130,128,126,124,124,122,126,126,126,132,136,138
         !db 138,132,126,122,120,122,122,124,126,128,128,130,130,130,130,130,130,130
         !db 130,128,126,126,126,124,126,126,128,132,132,130,128,126,124,126,128,130
         !db 130,128,130,132,130,128,124,124,126,126,128,130,130,130,130,128,126,128
         !db 130,132,130,126,126,126,128,128,128,128,128,128,128,130,130,130,130,128
         !db 128,126,126,126,126,128,128,132,130,130,130,130,130,126,126,128,130,126
         !db 128,128,124,124,124,128,130,130,130,128,128,128,126,128,128,128,126,128
         !db 128,128,128,128,128,126,126,128,126,126,126,126,128,128,126,128,128,128
         !db 128,128,128,128,128,128,126,126,126,126,124,124,126,128,130,130,130,128
         !db 126,124,124,126,124,124,126,128,130,130,130,128,126,126,126,124,124,124
         !db 126,126,126,128,128,128,128,128,128,128,126,124,124,124,124,126,128,128
         !db 128,126,128,128,128,126,126,128,128,126,126,124,124,124,124,126,126,126
         !db 126,126,128,128,126,126,126,126,126,126,124,126,126,126,128,128,128,130
         !db 130,128,126,124,122,122,126,128,128,128,130,128,126,126,126,126,126,128
         !db 126,124,124,124,124,126,128,130,128,128,126,124,124,126,126,128,128,130
         !db 128,128,126,126,126,124,124,124,126,126,126,126,128,128,130,130,128,126
         !db 124,124,124,126,124,126,128,130,130,128,124,126,126,126,128,126,124,122
         !db 124,126,126,126,126,128,128,128,128,128,126,126,126,124,124,124,126,126
         !db 128,128,128,128,128,126,126,126,126,126,126,128,130,132,128,124,124,126
         !db 126,126,126,126,128,126,128,128,128,126,126,128
         
        END FUNCTION
        '______________________________________________________________________________
         
        FUNCTION PBMAIN
         LOCAL FileNo AS LONG
         
         FileNo = FREEFILE
         OPEN "WebClip.wav" FOR OUTPUT AS #FileNo
         IF ERR THEN
           MessageBox 0, BYCOPY "Error:" & STR$(ERR), _
                         BYCOPY "WebClip.wav", %MB_ICONERROR OR %MB_OK
         ELSE
           PRINT #FileNo, BinBas;
           CLOSE #FileNo
           MessageBox 0, BYCOPY  "Creation of WebClip.wav successfull !", _
                         BYCOPY "WebClip.wav", %MB_ICONINFORMATION OR %MB_OK
         END IF
         
        END FUNCTION
        '______________________________________________________________________________

        Comment


        • #5
          I've found that IE 11 does not always display the expected Window Name:
          Code:
             If InStr(zText, "Microsoft Internet Explorer") Then
          This is in: Function hieGet() As Dword

          I'm experimenting...

          -John
          Last edited by John Montenigro; 2 Jan 2016, 03:24 PM.

          Comment


          • #6
            Hi John,
            You may try the following...
            Pierre

            Code:
            '______________________________________________________________________________
             
            FUNCTION hieGet() AS DWORD
             LOCAL hTry      AS DWORD
             LOCAL zCaption  AS ASCIIZ * 1024
             LOCAL zClass    AS ASCIIZ * 50
             LOCAL LenText   AS LONG
             
             hTry = GetForegroundWindow()
             GetClassName(hTry, zClass, 50)
             IF zClass = "IEFrame" THEN
               LenText = GetWindowText(hTry, zCaption, SIZEOF(zCaption))
               IF INSTR(zCaption, "Internet Explorer") THEN
                 IF INSTR(zCaption, "PowerBASIC") THEN
                   FUNCTION = hTry
                 END IF
               END IF
             END IF
             
            END FUNCTION
            '______________________________________________________________________________
            '
            Last edited by Pierre Bellisle; 14 Apr 2021, 09:55 PM.

            Comment

            Working...
            X