'===========================================================================
' Subject: Copy Web Text                      Date: 12-22-02 (  :  )       
'  Author: Achilles B. Mina                   Code: RAPIDQ                 
'  Origin: wasaywasay@edsamail.com.ph       Packet: RAPIDQ.ABC
'===========================================================================
'Copy WebText v1.01
'Uploaded 12/22/02
'By Achilles B. Mina

'This is a utility that automatically puts clipboard text onto a 
'text editor for reading, editing, saving and printing. Designed
'for those who can't afford to stay online too long but need to
'capture then read voluminous Website text. Also shows elapsed time.

'You can do as you please with this code but kindly acknowledge author
 

$INCLUDE "RAPIDQ.INC"

DECLARE SUB SetWindowPos Lib "User32" ALIAS "SetWindowPos"(hWnd As Long, hWndInsertAfter As Long, X As Long, Y As Long, cx As Long, cy As Long, wFlags As Long)
DECLARE FUNCTION SetFocus LIB "USER32" ALIAS "SetFocus" (HWnd AS LONG) AS LONG
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (hwnd As Long, nIndex As Long, dwNewLong As Long) As Long 
DECLARE SUB Splash
DECLARE SUB Process(Sender AS QMENUITEM) 
DECLARE SUB Find(Sender AS QBUTTON)
DECLARE SUB RadioCheck
DECLARE SUB Exits(Sender AS QMENUITEM)
DECLARE SUB CheckSave(key AS BYTE, shift AS INTEGER)
DECLARE SUB Saving
DECLARE SUB Radio
DECLARE SUB PrintClick
DECLARE SUB CloseFind
DECLARE SUB Changed
DECLARE SUB PasteClipboard
DECLARE SUB FormEShow

DEFBYTE saved, always
DEFSTR filename, oldtext, newtext, previous
DEFINT beginT

DIM ESave AS QSAVEDIALOG
DIM Font AS QFONT
DIM Fonts AS QFONTDIALOG
DIM OpenDialog AS QOPENDIALOG
DIM File as QFILESTREAM

CREATE Arial12 AS QFONT
    Name = "Arial"
    Size = 12
END CREATE

CREATE Timer1 AS QTIMER
  Interval = 1000
  OnTimer = PasteClipboard
END CREATE

CREATE SplashTimer AS QTIMER
  Interval = 1500
  OnTimer = Splash
END CREATE

CREATE SplashForm AS QFORM
  Height = 213
  Width = 213
  Center
  BorderStyle = 0
  CREATE SplashLabel AS QLABEL
    Color = &HEE00CC
    Align = 5
    Alignment = 3
    Layout = 1
    LabelStyle = 1
    Font = Arial12
    Caption = CHR$(13) + CHR$(13) +  CHR$(13) +  CHR$(13) + _
              "Copy WebText" + CHR$(13) + "copies and accumulates" + _
              CHR$(13) + "clipboard text." 
  END CREATE
    CREATE FormE AS QFORM
      Caption = "Copy WebText" 
      Center
      Width = 415 '320
      Height = 205
      Visible = 0
      AutoScroll = 0
      KeyPreview = 1
      OnShow = FormEShow
      OnKeyDown = CheckSave
      OnClose = Exits
      CREATE StatusBar AS QSTATUSBAR
        AddPanels "","","","",""
        Panel(0).Width = 50
        Panel(1).Width = 70
        Panel(2).Width = 63
        Panel(2).Caption = DATE$
        Panel(3).Width = 70
      END CREATE
      CREATE Main AS QMAINMENU
        CREATE MFile AS QMENUITEM
            Caption = "&File"
            CREATE iNew AS QMENUITEM
                Caption = "&New"
                OnClick = Process
            END CREATE            
            CREATE iOpen AS QMENUITEM
                Caption = "&Open"
                OnClick = Process
            END CREATE
            CREATE iSave AS QMENUITEM
                Caption = "&Save"
                OnClick = Process
            END CREATE
            CREATE iSaveAs AS QMENUITEM
                Caption = "Save &As"
                OnClick = Process
            END CREATE
            CREATE iClose AS QMENUITEM
                Caption = "&Close"
                OnClick = Exits
            END CREATE
            CREATE iLine1 AS QMENUITEM
                Caption = "-"
            END CREATE                                    
            CREATE iPrint AS QMENUITEM
                Caption = "&Print"
                OnClick = Process
            END CREATE
            CREATE iLine2 AS QMENUITEM
                Caption = "-"
            END CREATE
            CREATE iExit AS QMENUITEM
                Caption = "&Exit"
                OnClick = Exits
            END CREATE                                                    
        END CREATE
        CREATE MEdit AS QMENUITEM
            Caption = "&Edit"
            CREATE iSelect AS QMENUITEM
                Caption = "&Select All"
                OnClick = Process
            END CREATE
            CREATE iLine3 AS QMENUITEM
                Caption = "-"
            END CREATE
            CREATE iClear AS QMENUITEM
                Caption = "Cl&ear All"
                OnClick = Process
            END CREATE
            CREATE iLine4 AS QMENUITEM
                Caption = "-"
            END CREATE                        
            CREATE iCopy AS QMENUITEM
                Caption = "&Copy"
                OnClick = Process
            END CREATE
            CREATE iPaste AS QMENUITEM
                Caption = "&Paste"
                OnClick = Process
            END CREATE
            CREATE iCut AS QMENUITEM
                Caption = "Cu&t"
                OnClick = Process
            END CREATE                                   
        END CREATE
        CREATE MUndo AS QMENUITEM
            Caption = "&Undo"
            CREATE iUndo AS QMENUITEM
                Caption = "&Undo"
                OnClick = Process
            END CREATE
            CREATE iRedo AS QMENUITEM
                Caption = "&Redo"
                OnClick = Process
            END CREATE            
        END CREATE
        CREATE MFormat AS QMENUITEM
            Caption = "&Format"
            CREATE iFormat AS QMENUITEM
                Caption = "&Font"
                OnClick = Process
            END CREATE
            CREATE iRegular AS QMENUITEM
                Caption = "&Regular"
                OnClick = Process
            END CREATE
            CREATE iItalic AS QMENUITEM
                Caption = "&Italic"
                OnClick = Process
            END CREATE
            CREATE iBold AS QMENUITEM
                Caption = "&Bold"
                OnClick = Process
            END CREATE
            CREATE iUnderline AS QMENUITEM
                Caption = "&Underline"
                OnClick = Process
            END CREATE
            CREATE iUpper AS QMENUITEM
                Caption = "Upper&case"
                OnClick = Process
            END CREATE
            CREATE iLower AS QMENUITEM
                Caption = "&Lowercase"
                OnClick = Process
            END CREATE
            CREATE iUpLow AS QMENUITEM
                Caption = "U&pperLower"
                OnClick = Process
            END CREATE
        END CREATE         
        CREATE MFind AS QMENUITEM
            Caption = "&Search"
            CREATE iFind AS QMENUITEM
                Caption = "&Find/Replace"
                OnClick = Process
            END CREATE
            CREATE iCount AS QMENUITEM
                Caption = "&Word Count"
                OnClick = Process
            END CREATE
        END CREATE
        CREATE MOptions AS QMENUITEM
            Caption = "&Options"
            CREATE iTop AS QMENUITEM
                Caption = "&Topmost"
                OnClick = Process
            END CREATE
            CREATE iCapture AS QMENUITEM
                Caption = "&Stop Capture"
                OnClick = Process
            END CREATE
        END CREATE
        CREATE MAbout AS QMENUITEM
            Caption = "&About"
            OnClick = Process
        END CREATE                
    END CREATE
    CREATE Rich AS QRICHEDIT
        Align = 5
        ScrollBars = 2
        HideSelection = 0
        WantTabs = 1
        OnChange = Changed
    END CREATE
    CREATE FindDlg AS QFORM
        Height = 150
        Caption = "Find Dialog"      
        BorderStyle = 3
        FormStyle = 3
        Center
        OnClose = CloseFind
        CREATE FindText AS QEDIT
            Top = 10
            Left = 15
            Width = 170
            Height = 45
            Tag = 1
        END CREATE
        CREATE FindLabel AS QLABEL
            Top = 35
            Left = 18
            Width = 50
            Caption = "Find what word/s?"
        END CREATE
        CREATE FindButt AS QBUTTON
            Top = 10
            Left = 187
            Height = 22
            Width = 111            
            Caption = "Find"
            Default = 1
            OnClick = Find
        END CREATE
        CREATE Panel AS QPANEL
            Top = 60
            Left = 15
            Width = 283
            Height = 3
        END CREATE            
        CREATE ReplaceText AS QEDIT
            Top = 75
            Left = 15
            Width = 170
            Height = 45
        END CREATE
        CREATE ReplaceLabel AS QLABEL
            Top = 100
            Left = 18
            Width = 50
            Caption = "Replace with what?"
        END CREATE
        CREATE ReplaceButt AS QBUTTON
            Top = 75
            Left = 187
            Height = 22
            Width = 55
            Caption = "This"
            Default = 1
            OnClick = Find
        END CREATE
        CREATE ReplaceAButt AS QBUTTON
            Top = 75
            Left = 243
            Height = 22
            Width = 55
            Caption = "All"
            Default = 1
            OnClick = Find
        END CREATE
        CREATE RadioW AS QRADIOBUTTON
            Caption = "Whole word"
            Left = 140
            Top = 35
            Checked = 1
            OnClick = Radio
        END CREATE
        CREATE RadioP AS QRADIOBUTTON
            Caption = "Part of word"
            Left = 222
            Top = 35
            OnClick = Radio            
        END CREATE                                                       
    END CREATE      
  END CREATE
END CREATE

SUB Process(Sender)
    Rich.Visible = 1
    SELECT CASE Sender.Handle
        CASE iNew.Handle
            IF saved = 0 THEN 
              ESave.Caption = "Save As"
              Saving
            END IF
            Rich.Clear
            StatusBar.Panel(4).Caption = ""
            SetFocus(Rich.Handle)
        CASE iOpen.Handle
            CREATE Load AS QOPENDIALOG
                Caption = "Load File"
                Filter = "Plain text|*.txt|Rich Text Format|*.rtf|Word|*.doc|All files|*.*"
            END CREATE
            Timer1.Enabled = 0
            IF Load.Execute THEN
              IF Load.FilterIndex = 2 OR Load.FilterIndex = 2 THEN
                Rich.Plaintext = 0
              END IF
              Rich.Clear                 
              Rich.LoadFromFile(Load.FileName)
              saved = 1
            END IF
            Timer1.Enabled = 1
            filename = Load.FileName
            StatusBar.Panel(4).Caption = filename
        CASE iSave.Handle
            IF saved = 0 AND filename = "" THEN 
              ESave.Caption = "Save As"
              Saving
            ELSE
              Rich.SaveToFile(fileName)
            END IF
            saved = 1
        CASE iSaveAs.Handle
            ESave.Caption = "Save As"
            ESave.Filename = filename
            dotis = TALLY(filename,".")
            IF dotis <> 0 THEN ESave.Filename = LEFT$(ESave.filename,dotis-1)
            Saving                            
        CASE iPrint.Handle
            PrintClick
        CASE iSelect.Handle
            Rich.SelectAll
        CASE iClear.Handle
            Rich.Clear             
        CASE iCopy.Handle
            Rich.CopyToClipboard
        CASE iPaste.Handle
            oldtext = Rich.Text
            Rich.PasteFromClipboard                
        CASE iCut.Handle
            oldtext = Rich.Text
            Rich.CutToClipboard
        CASE iUndo.Handle
            newtext = Rich.Text
            Rich.Text = oldtext
            'Rich.PasteFromClipboard
            Rich.SelStart = LEN(Rich.Text)
        CASE iRedo.Handle
            Rich.Text = newtext
            Rich.SelStart = LEN(Rich.Text)
        CASE iFormat.Handle
            oldtext = Rich.Text
            Fonts.GetFont(Arial12)
            Timer1.Enabled = 0 
            IF Fonts.Execute THEN Fonts.SetFont(Font)
            Timer1.Enabled = 1
            Rich.SelAttributes = Font                                             
        CASE iFind.Handle
            Timer1.Enabled = 0 
            FindDlg.Visible = 1
        CASE iCount.Handle
            DIM wordcount AS WORD, charcount AS WORD, charcount0 AS WORD
            wordcount = 0
            charcount = LEN(Rich.Text)
            charcount0 = LEN(Rich.Text- CHR$(9) - CHR$(13) - CHR$(10) - " ")
            text$ = REPLACESUBSTR$(Rich.Text,CHR$(13)+CHR$(10)," ")
            DO
              text$ = REPLACESUBSTR$(text$,"  "," ")
            LOOP UNTIL TALLY(text$,"  ") = 0
            text$ = RTRIM$(LTRIM$(text$))
            IF INSTR(text$," ") <> 0 THEN 
              wordcount = TALLY(text$," ") + 1
            ELSEIF INSTR(text$," ") = 0 THEN
              IF LEN(text$) = 0 THEN
                wordcount = 0
              ELSE
                wordcount = 1
              END IF  
            END IF
            IF wordcount > 1 THEN 
              words$ = "Words" 
            ELSE 
              words$ = "Word"
            END IF
            IF charcount > 1 THEN 
              characters$ = "Characters" 
            ELSE 
              characters$ = "Character"
            END IF
            IF charcount0 > 1 THEN 
              characters0$ = "Characters" 
            ELSE 
              characters0$ = "Character"
            END IF
            Timer1.Enabled = 0         
            SHOWMESSAGE words$ + ":         " + STR$(wordcount) + CHR$(13) +_
                        characters$ + ":  " + STR$(charcount) + CHR$(13) +_
                        characters0$ + ":  " + STR$(charcount0) + CHR$(13) +_
                        "(no blanks)"
            Timer1.Enabled = 1
      CASE iTop.Handle
        IF always = 1 THEN always = 0 ELSE always = 1
      CASE iCapture.Handle
        IF iCapture.Caption = "&Stop Capture" THEN
          iCapture.Caption = "&Resume Capture"
        ELSE
          iCapture.Caption = "&Stop Capture" 
        END IF
      CASE iRegular.Handle
        Rich.SelAttributes.Italic = 0
        Rich.SelAttributes.Bold = 0
        Rich.SelAttributes.Underline = 0
      CASE iItalic.Handle
        Rich.SelAttributes.Italic = 1
      CASE iBold.Handle
        Rich.SelAttributes.Bold = 1
      CASE iUnderline.Handle
        Rich.SelAttributes.Underline = 1
      CASE iUpper.Handle
        Rich.Seltext  = UCASE$(Rich.Seltext)
      CASE iLower.Handle
        Rich.Seltext  = LCASE$(Rich.Seltext)
      CASE iUpLow.Handle
        text$ = LCASE$(Rich.Seltext)
        FOR x = 1 TO LEN(text$)
          char$ = MID$(text$,x,1)
          IF char$ = " " THEN
            nextchar$ = UCASE$(MID$(text$,x+1,1))      
            text$ = REPLACE$(text$,nextchar$,x+1)
          END IF
        NEXT
        Rich.Seltext = REPLACE$(text$,UCASE$(LEFT$(text$,1)),1)
      CASE mAbout.Handle
        Timer1.Enabled = 0
        SHOWMESSAGE "This is FREEWARE" + CHR$(13) +_
              " Copyright (c) 2002" + CHR$(13) +_ 
              "   Achilles B. Mina"
        Timer1.Enabled = 1
    END SELECT      
END SUB

SUB Find(Sender)
  DEFBYTE back
  SELECT CASE Sender.Handle
    CASE FindButt.Handle
      FindButt.Caption = "Next"
      back = 0 
      DO       
        whereword = INSTR(starts,Rich.Text,FindText.Text)
        wherelast = whereword + LEN(FindText.Text)
        IF wherelast > LEN(Rich.Text) THEN DEC wherelast   
        IF whereword > 1 THEN
            IF RadioW.Checked = 1 THEN
                SELECT CASE MID$(Rich.Text,whereword-1,1)
                    CASE " ",CHR$(13),CHR$(10)
                        SELECT CASE MID$(Rich.Text,wherelast,1)
                            CASE " ",CHR$(13),CHR$(10),RIGHT$(FindText.Text,1)                      
                                Rich.SelStart = whereword - 1
                                back = 0
                            CASE ELSE
                                starts = whereword + LEN(FindText.Text)
                                back = 1                        
                        END SELECT
                    CASE ELSE
                        starts = whereword + LEN(FindText.Text)
                        back = 1
                END SELECT        
            ELSE
                Rich.SelStart = whereword - 1     
            END IF    
            Rich.SelLength = LEN(FindText.Text)  'comment this out if you want cursor only
            starts = whereword + LEN(FindText.Text)
        ELSEIF whereword = 1 THEN
            IF RadioW.Checked = 1 THEN
                SELECT CASE MID$(Rich.Text,wherelast,1)
                    CASE " ",CHR$(13),CHR$(10)
                        Rich.SelStart = whereword - 1
                        back = 0
                END SELECT        
            ELSE
                Rich.SelStart = whereword - 1      
            END IF    
            Rich.SelLength = LEN(FindText.Text)  'comment this out if you want cursor only
            starts = whereword + LEN(FindText.Text)         
        ELSE
            Timer1.Enabled = 0
            SHOWMESSAGE "No more instances of " + FindText.Text
            Timer1.Enabled = 1
            starts = 0
            back = 0
        END IF
      LOOP UNTIL back = 0
    CASE ReplaceButt.Handle
      oldtext = Rich.Text
      diff = LEN(ReplaceText.Text) - LEN(FindText.Text)
      IF diff > 0 THEN
        Rich.Text = INSERT$(SPACE$(diff),Rich.Text,whereword)
        Rich.Text = REPLACE$(Rich.Text,ReplaceText.Text,whereword)
      ELSEIF diff < 0 THEN
        Rich.Text = REPLACE$(Rich.Text,ReplaceText.Text,whereword)
        Rich.Text = DELETE$(Rich.Text,whereword+LEN(ReplaceText.Text),ABS(SPACE$(diff)))
      ELSE
        Rich.Text = REPLACE$(Rich.Text,ReplaceText.Text,whereword)
      END IF
        Rich.SelStart = whereword + LEN(ReplaceText.Text) - 1
    CASE ReplaceAButt.Handle
      oldtext = Rich.Text
      Rich.Text = REPLACESUBSTR$(Rich.Text,FindText.Text,ReplaceText.Text)
      Rich.SelStart = RINSTR(Rich.Text,ReplaceText.Text) + LEN(ReplaceText.Text) -1
  END SELECT
END SUB

SUB CheckSave(key,shift)
  SELECT CASE shift
    CASE 0
      SELECT CASE key
        CASE 8,46
          'KILLMESSAGE(Rich.Handle,&h102)
          'Rich.CopyToClipboard
        CASE 27
          FormE.WindowState = 1
        CASE ELSE
          oldtext = Rich.Text
      END SELECT
    CASE 1
      SELECT CASE key
        CASE 83   'save
          IF saved = 0 AND filename = "" THEN 
            ESave.Caption = "Save As"
            Saving
          ELSE
            Rich.SaveToFile(fileName)
          END IF
          saved = 1
        CASE 67  'copy
          Rich.CopyToClipboard
          oldtext = Rich.Text
        CASE 86  'paste
          'Rich.PasteFromClipboard
        CASE 88  'cut
          oldtext = Rich.Text
          Rich.CutToClipboard
      END SELECT    
  END SELECT
END SUB

SUB Radio
  SetFocus(FindText.Handle)
END SUB

SUB PrintClick
  LPRINT Rich.Text
  LFLUSH 
END SUB 

SUB Exits(Sender)
  IF saved = 0 THEN
    Timer1.Enabled = 0
    ESave.Caption = "Save As"
    ESave.Filename = filename
    ESave.Filter = "Text files|*.txt;*.rtf;*.doc;*.wri;*.inc;*.ini|All files|*.*"                
    IF ESave.Execute THEN 
      Rich.SaveToFile(ESave.FileName)
      saved = 1
      filename = ""
      Rich.Clear
    ELSE
      IF Sender.Handle = iClose.Handle THEN
        filename = ""
        StatusBar.Panel(4).Caption = ""
        Rich.Clear
        saved = 1
      ELSE 
        Application.Terminate
      END IF
    END IF
    Timer1.Enabled = 1
  ELSE
    IF Sender.Handle = iClose.Handle THEN
      filename = ""
      StatusBar.Panel(4).Caption = ""
      Rich.Clear
      saved = 1
    ELSE 
      Application.Terminate
    END IF     
  END IF              
END SUB

SUB CloseFind
  Timer1.Enabled = 1 
  FindDlg.Visible = 0
END SUB

SUB Saving
  Timer1.Enabled = 0
  ESave.Filter = "Plain text|*.txt|Rich Text Format|*.rtf|Word|*.doc|All files|*.*"               
  IF ESave.Execute THEN 
    SELECT CASE ESave.FilterIndex
      CASE 1
        ext$ = ".txt"
        Rich.SelectAll
        Rich.Plaintext = 1
      CASE 2
        ext$ = ".rtf"
      CASE 3
        ext$ = ".doc"
      CASE 4
        ext$ = ""
        Rich.SelectAll
        Rich.Plaintext = 1
    END SELECT
    Rich.SaveToFile(ESave.FileName + ext$)
    saved = 1
    StatusBar.Panel(4).Caption = ESave.FileName + ext$
    IF ESave.FilterIndex = 3 OR ESave.FilterIndex = 4 THEN 
      Rich.Plaintext = 0
      Rich.SelLength = 0
      Rich.SelStart = LEN(Rich.Text)
    END IF                
  END IF
  Timer1.Enabled = 1
END SUB

SUB Changed
  saved = 0
  charcount0 = LEN(Rich.Text - CHR$(9) - CHR$(13) - CHR$(10) - " ")
  StatusBar.Panel(1).Caption = STR$(charcount0) + " chars"
END SUB 

SUB Splash
  SplashForm.Visible = 0
  SplashTimer.Enabled = 0
  FormE.Visible = 1 
END SUB

SUB FormEShow
  SENDMESSAGE Rich.Handle, &HC5, 1048576, 0 
  Setwindowlong(FormE.Handle,-8,0)
  Setwindowlong(Application.Handle,-8,FormE.Handle)
  always = 1
  beginT = TIMER   
END SUB

SUB PasteClipboard
  DIM elapsedT AS INTEGER
  DEFINT hour, min
  hour =  VAL(LEFT$(TIME$,2))
  min = VAL(MID$(TIME$,4,2))     
  IF hour >= 12 AND hour < 24 THEN
    hour = hour - 12
    IF hour = 0 THEN hour = 12
    ampm$ = " PM"
  ELSEIF hour = 0 THEN 
    hour = 12
    ampm$ = " AM"
  ELSE
    ampm$ = " AM"
  END IF
  IF min < 10 THEN
    StatusBar.Panel(3).Caption = STR$(hour) + ":0" + STR$(min) + RIGHT$(TIME$,3) + ampm$
  ELSE
    StatusBar.Panel(3).Caption = STR$(hour) + ":" + STR$(min) + RIGHT$(TIME$,3) + ampm$
  END IF
  elapsedT = TIMER - beginT
  IF elapsedT < 60 THEN
    secs = elapsedT 
    mins = 0
    hrs = 0
  ELSEIF elapsedT >= 60 AND elapsedT <= 3600 THEN
    hrs = 0
    mins = FIX(elapsedT/60)
    secs = elapsedT MOD 60
  ELSE
    hrs = FIX(elapsedT/3600)
    remainder = elapsedT MOD 3600
    IF remainder < 60 THEN
      secs = remainder
      mins = 0
    ELSE
      mins = FIX(remainder/60)
      secs = remainder MOD 60
    END IF
  END IF
  StatusBar.Panel(0).Caption = STR$(hrs) + ":"  + STR$(mins) + ":" + STR$(secs)
  IF iCapture.Caption = "&Stop Capture" THEN
    IF LEFT$(Clipboard.Text,10) <> previous THEN
      'Rich.Addstrings Clipboard.Text + CHR$(10)  'copies text
      Rich.PasteFromClipboard                     'copies text & format
      Rich.Addstrings CHR$(10)
      previous = LEFT$(Clipboard.Text,10)    
    END IF
  END IF
  IF always = 1 THEN
    SetWindowPos(FormE.Handle,-1,0,0,0,0,&H1 OR &H2)
  ELSE
    SetWindowPos(FormE.Handle,-2,0,0,0,0,&H1 OR &H2)  
  END IF
END SUB

SplashForm.Showmodal
