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
'------------------------------------------------------------------------------