File "linkedit.bas"

Path: /linkedit/linkedit.bas
File size: 30.05 KB
MIME-type:
Charset: utf-8

#COMPILE EXE "linkedit.exe"
#DIM ALL
#RESOURCE "linkedit.pbr"

'------------------------------------------------------------------------------
'   ** Includes **
'------------------------------------------------------------------------------
#INCLUDE ONCE "WIN32API.INC"
#INCLUDE ONCE "SHORTCUT.INC"
#INCLUDE ONCE "FILEDATE.INC"
#INCLUDE ONCE "ICON.INC"
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Types & Unions **
'------------------------------------------------------------------------------
TYPE NM_LISTVIEW DWORD
   hdr       AS NMHDR   ' NMHDR   hdr
   iItem     AS LONG    ' int     iItem
   iSubItem  AS LONG    ' int     iSubItem
   uNewState AS DWORD   ' UINT    uNewState
   uOldState AS DWORD   ' UINT    uOldState
   uChanged  AS DWORD   ' UINT    uChanged
   ptAction  AS POINT   ' POINT   ptAction
   lParam    AS LONG    ' LPARAM  lParam
END TYPE
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Constants **
'------------------------------------------------------------------------------
%IDC_BUTTON1   = 1001
%IDC_BUTTON2   = 1002
%IDC_BUTTON3   = 1003
%IDC_TAB1      = 1004
%IDC_GRAPHIC1  = 1005
%IDC_TEXTBOX1  = 1006
%IDC_LINE1     = 1007
%IDC_LABEL1    = 1008
%IDC_LABEL2    = 1009
%IDC_LABEL3    = 1010
%IDC_LABEL4    = 1011
%IDC_LINE2     = 1012
%IDC_LABEL5    = 1013
%IDC_LABEL6    = 1014
%IDC_LABEL7    = 1015
%IDC_LABEL8    = 1016
%IDC_LABEL9    = 1017
%IDC_LABEL10   = 1018
%IDC_LINE3     = 1019
%IDC_GRAPHIC2  = 1020
%IDC_LABEL11   = 1021
%IDC_LABEL12   = 1022
%IDC_LABEL13   = 1023
%IDC_LABEL14   = 1024
%IDC_LABEL15   = 1025
%IDC_LABEL16   = 1026
%IDC_LINE4     = 1027
%IDC_LABEL17   = 1028
%IDC_CHECKBOX1 = 1029
%IDC_CHECKBOX2 = 1030
%IDC_TEXTBOX2  = 1031
%IDC_TEXTBOX3  = 1032
%IDC_TEXTBOX4  = 1033
%IDC_TEXTBOX5  = 1034
%IDC_TEXTBOX6  = 1035
%IDC_LISTVIEW1 = 1036
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Globals **
'------------------------------------------------------------------------------
GLOBAL g_lnk    AS LINKTYPE
GLOBAL g_txt()  AS STRING
GLOBAL g_icof   AS STRING
GLOBAL g_hTab() AS DWORD
GLOBAL g_icoc   AS LONG
GLOBAL g_chk1   AS LONG
GLOBAL g_chk2   AS LONG
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Macros **
'------------------------------------------------------------------------------
MACRO M_ACT_CHANGE
    change = %TRUE
    CONTROL ENABLE GETPARENT(g_hTab(1)), %IDC_BUTTON1 ' Apply btn
    EXIT FUNCTION
END MACRO
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
MACRO M_DRAWICON_IN_TAB1AND2
    '**************************************************************************
    '*    Tab #1 : General                                                    *
    '**************************************************************************
    GRAPHIC ATTACH g_hTab(1), %IDC_GRAPHIC1
    GRAPHIC CLEAR
    GraphicDrawIconDll  g_hTab(1), %IDC_GRAPHIC1, _
       g_lnk.zIconFile, g_lnk.IconIndex, 0, 0, 32, 32
    GRAPHIC ATTACH g_hTab(1), %IDC_GRAPHIC1
    GRAPHIC RENDER "BMP", (0,19)-(12,31)

    '**************************************************************************
    '*    Tab #2 : Shortcut                                                   *
    '**************************************************************************
    GRAPHIC ATTACH g_hTab(2), %IDC_GRAPHIC2
    GRAPHIC CLEAR
    GraphicDrawIconDll  g_hTab(2), %IDC_GRAPHIC2, _
       g_lnk.zIconFile, g_lnk.IconIndex, 0, 0, 32, 32
    GRAPHIC ATTACH g_hTab(2), %IDC_GRAPHIC2
    GRAPHIC RENDER "BMP", (0,19)-(12,31)
END MACRO
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Main Application Entry Point **
'------------------------------------------------------------------------------
FUNCTION PBMAIN()
    LOCAL s AS STRING

    s = TRIM$(COMMAND$, ANY $SPC+$TAB+$DQ)

    IF RIGHT$(LCASE$(s), 4) <> ".lnk" THEN
        ?"Error: argument needed."+$CR+$CR _
        +"Either call ""linkedit myshortcut.lnk"""+$CR _
        +"on the command line"+$CR _
        +"-or-"+$CR _
        +"drag and drop a Windows shortcut"+$CR _
        +"onto this program." _
        ,%MB_ICONINFORMATION ,"linkedit"
        EXIT FUNCTION
    END IF

    ' Parse shortcut from argument
    g_lnk.zLinkFolder = PATHNAME$(PATH, s)
    g_lnk.zLinkName   = PATHNAME$(NAMEX, s)

    ' Show main dialog
    MainShow %HWND_DESKTOP

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

'------------------------------------------------------------------------------
'   ** Dialogs **
'------------------------------------------------------------------------------
FUNCTION MainShow(BYVAL hParent AS DWORD) AS LONG
    LOCAL hDlg   AS DWORD
    LOCAL lRslt  AS LONG
    LOCAL lStyle AS LONG

    DIALOG NEW PIXELS, hParent, "Properties",,, 364, 518, %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_CONTROLPARENT OR %WS_EX_LEFT OR _
        %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg
    DIALOG SET ICON   hDlg, "AICO"

    CONTROL ADD BUTTON,   hDlg, %IDOK,           "OK", 120, 489, 72, 22
    DIALOG  SEND          hDlg, %DM_SETDEFID,    %IDOK, 0
    CONTROL ADD BUTTON,   hDlg, %IDCANCEL,       "Cancel", 200, 489, 72, 22
    CONTROL ADD BUTTON,   hDlg, %IDC_BUTTON1,    "&Apply", 280, 489, 72, 22
    CONTROL DISABLE       hDlg, %IDC_BUTTON1

    DIM g_hTab(1 TO 3) AS DWORD
    CONTROL ADD TAB,      hDlg, %IDC_TAB1,       "Tab", 10, 10, 344, 470
    TAB INSERT PAGE       hDlg, %IDC_TAB1, 1, 0, "General"  CALL MainProc TO g_hTab(1)
    TAB INSERT PAGE       hDlg, %IDC_TAB1, 2, 0, "Shortcut" CALL MainProc TO g_hTab(2)
    TAB INSERT PAGE       hDlg, %IDC_TAB1, 3, 0, "Details"  CALL MainProc TO g_hTab(3)
    TAB SELECT            hDlg, %IDC_TAB1, 2

    '**************************************************************************
    '*    Tab #1 : General                                                    *
    '**************************************************************************

    CONTROL ADD GRAPHIC, g_hTab(1), %IDC_GRAPHIC1,"", 14, 12, 32, 32
    CONTROL ADD TEXTBOX, g_hTab(1), %IDC_TEXTBOX1,"", 84, 20, 242, 20 ' Shortcut name

    CONTROL ADD LINE,     g_hTab(1), %IDC_LINE1,  "---", 8, 52, 318, 1

    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL1, "Type of file:", 10, 62, 68, 20
    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL1, "Shortcut (.lnk)", 80, 62, 246, 20
    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL1, "Description:", 10, 88, 68, 20
    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL2, "", 80, 88, 246, 20

    CONTROL ADD LINE,     g_hTab(1), %IDC_LINE1,  "---", 8, 118, 318, 1

    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL1, "Location:", 10, 128, 68, 20
    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL3, "", 80, 128, 246, 20
    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL1, "Size:", 10, 154, 68, 20
    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL4, "", 80, 154, 246, 20
    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL1, "Size on disk:", 10, 180, 68, 20
    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL5, "", 80, 180, 246, 20

    CONTROL ADD LINE,     g_hTab(1), %IDC_LINE1,  "---", 8, 210, 318, 1

    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL1, "Created:", 10, 224, 68, 20
    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL6, "", 80, 224, 246, 20
    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL1, "Modified:", 10, 250, 68, 20
    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL7, "", 80, 250, 246, 20
    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL1, "Accessed:", 10, 276, 68, 20
    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL8, "", 80, 276, 246, 20

    CONTROL ADD LINE,     g_hTab(1), %IDC_LINE1,  "---", 8, 305, 318, 1

    CONTROL ADD LABEL,    g_hTab(1), %IDC_LABEL1,   "Attributes:", 10, 320, 68, 20
    CONTROL ADD CHECKBOX, g_hTab(1), %IDC_CHECKBOX1,"&Read-only", 80, 317, 75, 20
    CONTROL ADD CHECKBOX, g_hTab(1), %IDC_CHECKBOX2,"&Hidden", 160, 317, 75, 20

    '**************************************************************************
    '*    Tab #2 : Shortcut                                                   *
    '**************************************************************************

    CONTROL ADD GRAPHIC,  g_hTab(2), %IDC_GRAPHIC2,"", 14, 12, 32, 32
    CONTROL ADD LABEL,    g_hTab(2), %IDC_LABEL9,  "", 84, 20, 242, 20 ' Shortcut name

    CONTROL ADD LINE,     g_hTab(2), %IDC_LINE1,   "", 8, 52, 318, 1

    CONTROL ADD LABEL,    g_hTab(2), %IDC_LABEL1,  "Target type:", 10, 62, 80, 20
    CONTROL ADD LABEL,    g_hTab(2), %IDC_LABEL1,  "Application", 90, 62, 236, 20
    CONTROL ADD LABEL,    g_hTab(2), %IDC_LABEL1,  "Target location:", 10, 88, 80, 20
    CONTROL ADD LABEL,    g_hTab(2), %IDC_LABEL10, "", 90, 88, 236, 20 ' folder(1)
    CONTROL ADD LABEL,    g_hTab(2), %IDC_LABEL1,  "&Target:", 10, 114, 80, 20
    CONTROL ADD TEXTBOX,  g_hTab(2), %IDC_TEXTBOX2,"", 90, 112, 236, 20

    CONTROL ADD LINE,     g_hTab(2), %IDC_LINE1,   "", 8, 149, 318, 1

    CONTROL ADD LABEL,    g_hTab(2), %IDC_LABEL1,  "&Start in:", 10, 168, 80, 20
    CONTROL ADD TEXTBOX,  g_hTab(2), %IDC_TEXTBOX3,"", 90, 166, 236, 20
    CONTROL ADD LABEL,    g_hTab(2), %IDC_LABEL1,  "Shortcut &key:", 10, 194, 80, 20
    CONTROL ADD TEXTBOX,  g_hTab(2), %IDC_TEXTBOX4,"None", 90, 192, 236, 20
    CONTROL DISABLE       g_hTab(2), %IDC_TEXTBOX4
    CONTROL ADD LABEL,    g_hTab(2), %IDC_LABEL1,  "&Run:", 10, 220, 80, 20
    CONTROL ADD TEXTBOX,  g_hTab(2), %IDC_TEXTBOX5,"Normal window", 90, 218, 236, 20
    CONTROL DISABLE       g_hTab(2), %IDC_TEXTBOX5
    CONTROL ADD LABEL,    g_hTab(2), %IDC_LABEL1,  "C&omment:", 10, 246, 80, 20
    CONTROL ADD TEXTBOX,  g_hTab(2), %IDC_TEXTBOX6,"", 90, 244, 236, 20

    CONTROL ADD BUTTON,   g_hTab(2), %IDC_BUTTON2, "Open &File Location", 113, 279, 118, 22
    CONTROL ADD BUTTON,   g_hTab(2), %IDC_BUTTON3, "&Change Icon...", 239, 279, 90, 22

    '**************************************************************************
    '*    Tab #3 : Details                                                    *
    '**************************************************************************
    CONTROL ADD LISTVIEW,  g_hTab(3), %IDC_LISTVIEW1,    "Listview1", 14, 14, 316, 356
    LISTVIEW GET STYLEXX   g_hTab(3), %IDC_LISTVIEW1 TO lStyle
    lStyle += %LVS_EX_FULLROWSELECT
    LISTVIEW SET STYLEXX   g_hTab(3), %IDC_LISTVIEW1, lStyle
    LISTVIEW INSERT COLUMN g_hTab(3), %IDC_LISTVIEW1, 1, "Property", 74, 0
    LISTVIEW INSERT COLUMN g_hTab(3), %IDC_LISTVIEW1, 2, "Value", 234, 0

    DIALOG SHOW MODAL hDlg, CALL MainProc TO lRslt

    FUNCTION = lRslt
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION ChgIcoShow(BYVAL hParent AS DWORD) AS LONG
    LOCAL hDlg    AS DWORD
    LOCAL stylex  AS DWORD
    LOCAL lRslt   AS LONG

    DIALOG NEW PIXELS, hParent, "Change Icon", 36, 96, 292, 326, %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_CONTROLPARENT OR %WS_EX_LEFT OR _
        %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg

    CONTROL ADD BUTTON,    hDlg, %IDOK, "OK", 124, 292, 72, 22
    DIALOG  SEND           hDlg, %DM_SETDEFID, %IDOK, 0
    CONTROL ADD BUTTON,    hDlg, %IDCANCEL, "Cancel", 205, 292, 72, 22

    CONTROL ADD LABEL,     hDlg, %IDC_LABEL1, "&Look for icons in this file:", 10, 10, 267, 20
    CONTROL ADD TEXTBOX,   hDlg, %IDC_TEXTBOX1, g_lnk.zIconFile, 10, 30, 184, 20
    CONTROL ADD BUTTON,    hDlg, %IDC_BUTTON1, "&Browse", 206, 29, 72, 22
    CONTROL ADD LABEL,     hDlg, %IDC_LABEL2, "&Select an icon from the list below:", 10, 56, 267, 20

    ' Create an icon listview
    CONTROL ADD LISTVIEW,  hDlg, %IDC_LISTVIEW1, "", 12, 78, 266, 198, _
        %WS_VISIBLE OR %WS_CHILD OR %WS_HSCROLL OR %LVS_SINGLESEL OR _
        %LVS_ICON OR %LVS_AUTOARRANGE OR %LVS_SHOWSELALWAYS, %WS_EX_CLIENTEDGE
    LISTVIEW INSERT COLUMN hDlg, %IDC_LISTVIEW1, 1, "icon", 32, 0

    ' Set the listview extended style and icon spacing
    LISTVIEW GET STYLEXX   hDlg, %IDC_LISTVIEW1 TO stylex
    stylex += %LVS_EX_ONECLICKACTIVATE + %LVS_EX_BORDERSELECT + %LVS_EX_HIDELABELS
    LISTVIEW SET STYLEXX   hDlg, %IDC_LISTVIEW1, stylex
    SENDMESSAGE GETDLGITEM(hDlg, %IDC_LISTVIEW1), %LVM_SETICONSPACING, 0, MAK(DWORD,40,50)

    DIALOG SHOW MODAL hDlg, CALL ChgIcoProc TO lRslt

    FUNCTION = lRslt
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** CallBacks **
'------------------------------------------------------------------------------
CALLBACK FUNCTION MainProc()
    STATIC change AS LONG
    LOCAL  txt    AS STRING
    LOCAL  chk    AS LONG
    LOCAL  lRes   AS LONG

    SELECT CASE AS LONG CB.MSG

        CASE %WM_INITDIALOG
            ' Initialization handler
            change = %TRUE
            FillShortcutNfo(CB.HNDL)
            change = %FALSE

        CASE %WM_COMMAND
            ' Process control notifications
            SELECT CASE AS LONG CB.CTL

                CASE %IDOK
                    SaveShortcut()
                    DIALOG END CB.HNDL

                CASE %IDCANCEL
                    DIALOG END CB.HNDL

                CASE %IDC_BUTTON1 ' Apply
                    SaveShortcut()
                    change = %FALSE
                    CONTROL DISABLE CB.HNDL, CB.CTL ' Apply btn

                CASE %IDC_BUTTON2 ' Open File Location
                    ShellExecute 0, "open", "explorer.exe" + $NUL, "/select," _
                      + $DQ + RTRIM$(g_lnk.zLinkFolder, "\") + "\" _
                      + g_lnk.zLinkName + $DQ + $NUL, "", %SW_SHOW

                CASE %IDC_BUTTON3 ' Change Icon
                    lRes = ChgIcoShow(GETPARENT(g_hTab(2)))
                    IF lRes <> %IDOK THEN EXIT FUNCTION
                    M_DRAWICON_IN_TAB1AND2
                    IF ISTRUE change THEN EXIT FUNCTION
                    IF g_icof <> g_lnk.zIconFile THEN
                        M_ACT_CHANGE
                    ELSEIF g_icoc <> g_lnk.IconIndex THEN
                        M_ACT_CHANGE
                    END IF

                CASE %IDC_TEXTBOX1
                    IF ISTRUE change THEN EXIT FUNCTION
                    CONTROL GET TEXT g_hTab(1), %IDC_TEXTBOX1 TO txt ' Shortcut name
                    IF txt <> g_txt(1) THEN
                        M_ACT_CHANGE
                    END IF

                CASE %IDC_TEXTBOX2
                    IF ISTRUE change THEN EXIT FUNCTION
                    CONTROL GET TEXT g_hTab(2), %IDC_TEXTBOX2 TO txt ' Target
                    IF txt <> g_txt(2) THEN
                        M_ACT_CHANGE
                    END IF

                CASE %IDC_TEXTBOX3
                    IF ISTRUE change THEN EXIT FUNCTION
                    CONTROL GET TEXT g_hTab(2), %IDC_TEXTBOX3 TO txt ' Start in
                    IF txt <> g_txt(3) THEN
                        M_ACT_CHANGE
                    END IF

                CASE %IDC_TEXTBOX6
                    IF ISTRUE change THEN EXIT FUNCTION
                    CONTROL GET TEXT g_hTab(2), %IDC_TEXTBOX6 TO txt ' Comment
                    IF txt <> g_txt(6) THEN
                        M_ACT_CHANGE
                    END IF

                CASE %IDC_CHECKBOX1, %IDC_CHECKBOX2
                    IF ISTRUE change THEN EXIT FUNCTION
                    CONTROL GET CHECK g_hTab(1), %IDC_CHECKBOX1 TO chk
                    IF chk <> g_chk1 THEN
                        M_ACT_CHANGE
                    END IF
                    CONTROL GET CHECK g_hTab(1), %IDC_CHECKBOX2 TO chk
                    IF chk <> g_chk2 THEN
                        M_ACT_CHANGE
                    END IF

            END SELECT
    END SELECT

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

'------------------------------------------------------------------------------
CALLBACK FUNCTION ChgIcoProc()
    LOCAL file  AS STRING
    LOCAL lvs   AS LONG
    LOCAL lvNm  AS NM_LISTVIEW PTR

    SELECT CASE AS LONG CB.MSG
        CASE %WM_INITDIALOG ' Initialization: populate the listview with icons
            PopulateIconLV CB.HNDL, %IDC_LISTVIEW1, g_lnk.zIconFile, g_lnk.IconIndex

        CASE %WM_NOTIFY ' Double-click in listview = select and OK
            IF LOWRD(CB.WPARAM)= %IDC_LISTVIEW1 THEN
                lvNm = CB.LPARAM
                IF @lvNm.hdr.code = %NM_DBLCLK THEN _
                    SENDMESSAGE CB.HNDL, %WM_COMMAND, %IDOK, 0
            END IF

        CASE %WM_COMMAND ' Process control notifications
            SELECT CASE AS LONG CB.CTL

                CASE %IDOK
                    CONTROL GET TEXT CB.HNDL, %IDC_TEXTBOX1 TO g_lnk.zIconFile
                    LISTVIEW GET SELECT CB.HNDL, %IDC_LISTVIEW1 TO lvs
                    g_lnk.IconIndex = lvs - 1
                    DIALOG END CB.HNDL, %IDOK

                CASE %IDCANCEL
                    DIALOG END CB.HNDL, %IDCANCEL

                CASE %IDC_BUTTON1 ' Browse button
                    DISPLAY OPENFILE CB.HNDL, -120, -60, "Change Icon", "", _
                      CHR$("Icon files (*.ico;*.exe;*.dll)", 0, _
                      "*.ico;*.exe;*.dll", 0), "", "", _
                      %OFN_PATHMUSTEXIST OR %OFN_FILEMUSTEXIST _
                      OR %OFN_NONETWORKBUTTON TO file
                    IF file = "" THEN EXIT FUNCTION
                    CONTROL SET TEXT CB.HNDL, %IDC_TEXTBOX1, file
                    PopulateIconLV CB.HNDL, %IDC_LISTVIEW1, file, 0

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

'------------------------------------------------------------------------------
'   ** Functions & Subs **
'------------------------------------------------------------------------------
SUB FillShortcutNfo(BYVAL hDlg AS DWORD)
    LOCAL lnkpath AS STRING
    LOCAL e       AS STRING
    LOCAL i       AS LONG

    '******************
    ReadShortcut(g_lnk)
    lnkpath = RTRIM$(g_lnk.zLinkFolder, "\") + "\" + g_lnk.zLinkName
    g_icof = g_lnk.zIconFile : g_icoc = g_lnk.IconIndex ' (reference value)
    REDIM g_txt(1 TO 6)
    '******************

    '**************************************************************************
    '*    Dialog caption & title + icons in tabs 1 & 2                        *
    '**************************************************************************
    DIALOG SET TEXT   hDlg, LEFT$(g_lnk.zLinkName, -4) + " Properties"
    M_DRAWICON_IN_TAB1AND2

    '**************************************************************************
    '*    Tab #1 : General                                                    *
    '**************************************************************************
    CONTROL SET TEXT     g_hTab(1), %IDC_TEXTBOX1, LEFT$(g_lnk.zLinkName, -4)       ' Shortcut name
    g_txt(1) = LEFT$(g_lnk.zLinkName, -4)                                           ' (reference value)
    CONTROL SET TEXT     g_hTab(1), %IDC_LABEL2,   PATHNAME$(NAMEX, g_lnk.zExeName) ' Description
    CONTROL SET TEXT     g_hTab(1), %IDC_LABEL3,   RTRIM$(g_lnk.zLinkFolder, "\")   ' Location
    e = FileSizeKB(lnkpath) + " (" + FileSizeB(lnkpath) + ")"
    CONTROL SET TEXT     g_hTab(1), %IDC_LABEL4,   e                                ' Size
    CONTROL SET TEXT     g_hTab(1), %IDC_LABEL5,   "4.00 KB (4096 bytes)"           ' Size on disk
    CONTROL SET TEXT     g_hTab(1), %IDC_LABEL6,   CreatedDate (lnkpath)            ' Created
    CONTROL SET TEXT     g_hTab(1), %IDC_LABEL7,   ModifiedDate(lnkpath)            ' Modified
    CONTROL SET TEXT     g_hTab(1), %IDC_LABEL8,   AccessedDate(lnkpath)            ' Accessed
    g_chk1 = 0 : IF (GETATTR(lnkpath) AND %READONLY) = %READONLY THEN g_chk1 = 1    ' (reference value)
    CONTROL SET CHECK    g_hTab(1), %IDC_CHECKBOX1, g_chk1                          ' Read-only
    g_chk2 = 0 : IF (GETATTR(lnkpath) AND %HIDDEN) = %HIDDEN THEN g_chk2 = 1        ' (reference value)
    CONTROL SET CHECK    g_hTab(1), %IDC_CHECKBOX2, g_chk2                          ' Hidden

    '**************************************************************************
    '*    Tab #2 : Shortcut                                                   *
    '**************************************************************************
    CONTROL SET TEXT     g_hTab(2), %IDC_LABEL9,   LEFT$(g_lnk.zLinkName, -4)       ' Shortcut name
    CONTROL SET TEXT     g_hTab(2), %IDC_LABEL10,  LEFT$(g_lnk.zLinkName, -4)       ' Target location
    CONTROL SET TEXT     g_hTab(2), %IDC_TEXTBOX2, g_lnk.zExeName                   ' Target
    g_txt(2) = g_lnk.zExeName                                                       ' (reference value)
    CONTROL SET TEXT     g_hTab(2), %IDC_TEXTBOX3, g_lnk.zWorkDir                   ' Start in
    g_txt(3) = g_lnk.zWorkDir                                                       ' (reference value)
    CONTROL SET TEXT     g_hTab(2), %IDC_TEXTBOX6, g_lnk.zComment                   ' Comment
    g_txt(6) = g_lnk.zComment                                                       ' (reference value)

    '**************************************************************************
    '*    Tab #3 : Details                                                    *
    '**************************************************************************
    LISTVIEW RESET       g_hTab(3), %IDC_LISTVIEW1
    LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 1, 0, "Name"
    LISTVIEW SET TEXT    g_hTab(3), %IDC_LISTVIEW1, 1, 2, g_lnk.zLinkName
    LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 2, 0, "Type"
    LISTVIEW SET TEXT    g_hTab(3), %IDC_LISTVIEW1, 2, 2, "Shortcut"
    LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 3, 0, "File location"
    LISTVIEW SET TEXT    g_hTab(3), %IDC_LISTVIEW1, 3, 2, RTRIM$(g_lnk.zLinkFolder, "\")
    LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 4, 0, "Size"
    LISTVIEW SET TEXT    g_hTab(3), %IDC_LISTVIEW1, 4, 2, FileSizeKB(lnkpath)
    LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 5, 0, "Date created"
    LISTVIEW SET TEXT    g_hTab(3), %IDC_LISTVIEW1, 5, 2, LEFT$(CreatedDate (lnkpath), -3)
    LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 6, 0, "Date modified"
    LISTVIEW SET TEXT    g_hTab(3), %IDC_LISTVIEW1, 6, 2, LEFT$(ModifiedDate(lnkpath), -3)
    LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 7, 0, "Attributes"
    LISTVIEW SET TEXT    g_hTab(3), %IDC_LISTVIEW1, 7, 2, FileAttrFormat(lnkpath)
    LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 8, 0, "Owner"
    LISTVIEW SET TEXT    g_hTab(3), %IDC_LISTVIEW1, 8, 2, FileOwnerFormat(lnkpath)
    LISTVIEW INSERT ITEM g_hTab(3), %IDC_LISTVIEW1, 9, 0, "Computer"
    LISTVIEW SET TEXT    g_hTab(3), %IDC_LISTVIEW1, 9, 2, GetPCName()
END SUB
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
SUB SaveShortcut()
    LOCAL lnkpath AS STRING
    LOCAL txt     AS STRING
    LOCAL chk     AS LONG
    LOCAL atr     AS LONG

    ' Get all modifiable fields in tabs 1 & 2 (+ possibly changed icon) :

    '**************************************************************************
    '*    Tab #1 : General                                                    *
    '**************************************************************************
    ' Shortcut name
    CONTROL GET TEXT g_hTab(1), %IDC_TEXTBOX1 TO txt
    IF txt <> g_txt(1) THEN                                                         ' Shortcut renamed!
        IF RIGHT$(LCASE$(txt), 4) = ".lnk" THEN txt = LEFT$(txt, -4)
        KILL RTRIM$(g_lnk.zLinkFolder, "\") + "\" +   txt    + ".lnk"
        NAME RTRIM$(g_lnk.zLinkFolder, "\") + "\" + g_txt(1) + ".lnk" _
          AS RTRIM$(g_lnk.zLinkFolder, "\") + "\" +   txt    + ".lnk"
        g_lnk.zLinkName = txt + ".lnk"
    END IF
    lnkpath = RTRIM$(g_lnk.zLinkFolder, "\") + "\" + g_lnk.zLinkName
    atr = GETATTR(lnkpath)
    ' Read-only
    CONTROL GET CHECK g_hTab(1), %IDC_CHECKBOX1 TO chk
    IF chk <> g_chk1 THEN
        IF chk = 0 AND ((atr AND %READONLY) = %READONLY) THEN atr -= %READONLY
        IF chk = 1 AND ((atr AND %READONLY) = 0) THEN atr += %READONLY
    END IF
    ' Hidden
    CONTROL GET CHECK g_hTab(1), %IDC_CHECKBOX2 TO chk
    IF chk <> g_chk2 THEN
        IF chk = 0 AND ((atr AND %HIDDEN) = %HIDDEN) THEN atr -= %HIDDEN
        IF chk = 1 AND ((atr AND %HIDDEN) = 0) THEN atr += %HIDDEN
    END IF
    ' Refresh file attributes
    SETATTR lnkpath, atr

    '**************************************************************************
    '*    Tab #2 : Shortcut                                                   *
    '**************************************************************************
    CONTROL GET TEXT g_hTab(2), %IDC_TEXTBOX2 TO g_lnk.zExeName                     ' Target
    CONTROL GET TEXT g_hTab(2), %IDC_TEXTBOX3 TO g_lnk.zWorkDir                     ' Start in
    CONTROL GET TEXT g_hTab(2), %IDC_TEXTBOX6 TO g_lnk.zComment                     ' Comment

    '**************************************************************************
    '*    Save everything! then refresh dialog                                *
    '**************************************************************************
    WriteShortcut(g_lnk)
    FillShortcutNfo(GETPARENT(g_hTab(1)))

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

'------------------------------------------------------------------------------
SUB PopulateIconLV(BYVAL hDlg AS DWORD, BYVAL ctlId AS LONG, _
                   BYVAL icof AS STRING, BYVAL icoc AS LONG)
    STATIC hImgLst AS DWORD
    LOCAL  hIcon   AS DWORD
    LOCAL  tIcons  AS LONG
    LOCAL  cIcons  AS LONG
    LOCAL  lRslt   AS LONG

    LISTVIEW RESET hDlg, ctlId
    IF hImgLst <> 0 THEN IMAGELIST KILL hImgLst

    IMAGELIST NEW ICON 32, 32, 32, 6 TO hImgLst
    tIcons = ExtractIcon(BYVAL 0, (icof), -1)
    FOR cIcons = 0 TO tIcons -1
        hIcon = ExtractIcon(BYVAL 0, (icof), cIcons)
        LISTVIEW SET IMAGELIST hDlg, ctlId, hImgLst, 0
        IMAGELIST ADD ICON hImgLst, hIcon TO lRslt
        LISTVIEW INSERT ITEM   hDlg, ctlId, cIcons+1, cIcons+1, ""
        DestroyIcon hIcon
    NEXT cIcons

    LISTVIEW SELECT   hDlg, ctlId, icoc+1
    LISTVIEW VISIBLE  hDlg, ctlId, icoc+1
    CONTROL SET FOCUS hDlg, ctlId

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

'------------------------------------------------------------------------------
FUNCTION GetPCName() AS STRING
    LOCAL zText AS ASCIIZ * (%MAX_COMPUTERNAME_LENGTH + 1)
    GetComputerName zText, SIZEOF(zText)
    FUNCTION = TRIM$(zText)
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION FileAttrFormat(BYVAL file AS STRING) AS STRING
    LOCAL r AS STRING
    LOCAL i AS LONG

    i = GETATTR(file)
    IF (i AND %ARCHIVE ) = %ARCHIVE  THEN r += "A"
    IF (i AND %SYSTEM  ) = %SYSTEM   THEN r += "S"
    IF (i AND %HIDDEN  ) = %HIDDEN   THEN r += "H"
    IF (i AND %READONLY) = %READONLY THEN r += "R"

    FUNCTION = r
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION FileOwnerFormat(BYVAL file AS STRING) AS STRING
    LOCAL r  AS STRING
    LOCAL ff AS LONG
    LOCAL i  AS LONG

    IF INSTR(file, " ") > 0 THEN file = $DQ + file + $DQ
    r = RTRIM$(ENVIRON$("TEMP"), "\") + "\linkedit.dir-q"
    IF INSTR(r, " ") > 0 THEN r = $DQ + r + $DQ
    SHELL "start dir /q " + file + " > " + r
    ff = FREEFILE
    OPEN RTRIM$(ENVIRON$("TEMP"), "\") + "\linkedit.dir-q" FOR INPUT AS #ff
    FOR i = 1 TO 6
        LINE INPUT #ff, r
    NEXT
    CLOSE #ff
    FUNCTION = TRIM$(MID$(r, 37, 23))

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

'------------------------------------------------------------------------------
FUNCTION FileSizeB(BYVAL file AS STRING) AS STRING
    LOCAL ff AS LONG
    LOCAL sz AS LONG

    ' Get file size
    ff = FREEFILE
    OPEN file FOR BINARY ACCESS READ LOCK SHARED AS #ff
    sz = LOF(#ff)
    CLOSE #ff

    ' Return it formatted
    FUNCTION = FORMAT$(sz) + " bytes"

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

'------------------------------------------------------------------------------
FUNCTION FileSizeKB(BYVAL file AS STRING) AS STRING
    LOCAL ff AS LONG
    LOCAL sz AS LONG

    ' Get file size
    ff = FREEFILE
    OPEN file FOR BINARY ACCESS READ LOCK SHARED AS #ff
    sz = LOF(#ff)
    CLOSE #ff

    ' If shortcut >= 1.0 KB : show size in KB, else in B.
    IF sz >= 1024 THEN
        ff = FIX(sz / 10.24)
        FUNCTION  = LEFT$(FORMAT$(ff),-2) + "." + RIGHT$(FORMAT$(ff),2) + " KB"
    ELSE
        FUNCTION = FORMAT$(sz) + " bytes"
    END IF

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