1867 lines
66 KiB
Plaintext
1867 lines
66 KiB
Plaintext
-- ui_win.e
|
|
|
|
include window.ew
|
|
include wee.exw
|
|
include std/text.e
|
|
include std/filesys.e
|
|
include std/sort.e
|
|
include std/machine.e
|
|
include std/dll.e
|
|
include std/get.e
|
|
|
|
-- MenuItem constants
|
|
constant
|
|
File_New = 101,
|
|
File_Open = 102,
|
|
File_Save = 103,
|
|
File_SaveAs = 104,
|
|
File_Close = 105,
|
|
File_PageSetup = 106,
|
|
File_Print = 107,
|
|
File_Exit = 108,
|
|
File_Recent = 110,
|
|
Edit_Undo = 201,
|
|
Edit_Cut = 202,
|
|
Edit_Copy = 203,
|
|
Edit_Paste = 204,
|
|
Edit_Clear = 205,
|
|
Edit_SelectAll = 206,
|
|
Edit_Redo = 207,
|
|
Edit_ToggleComment = 208,
|
|
Search_Find = 301,
|
|
Search_Find_Next = 302,
|
|
Search_Find_Prev = 303,
|
|
Search_Replace = 304,
|
|
View_Subs = 401,
|
|
View_Error = 402,
|
|
View_Completions = 404,
|
|
View_Declaration = 405,
|
|
View_GoBack = 406,
|
|
View_SubArgs = 407,
|
|
Run_Start = 501,
|
|
Run_WithArgs = 502,
|
|
Run_Arguments = 503,
|
|
Run_Interpreter = 507,
|
|
Run_Bind = 504,
|
|
Run_Shroud = 505,
|
|
Run_Translate = 506,
|
|
Options_Font = 601,
|
|
Options_LineNumbers = 602,
|
|
Options_SortedSubs = 603,
|
|
Options_Colors = 604,
|
|
Options_LineWrap = 605,
|
|
Options_ReopenTabs = 606,
|
|
Options_CompleteStatements = 607,
|
|
Options_CompleteBraces = 608,
|
|
Options_Indent = 609,
|
|
Options_ErrorIndicators = 610,
|
|
Help_About = 701,
|
|
Help_ReleaseNotes = 702,
|
|
Help_Tutorial = 703,
|
|
Help_Context = 704,
|
|
Select_Tab = 801,
|
|
Select_Next_Tab = 811,
|
|
Select_Prev_Tab = 812
|
|
|
|
constant file_filters = allocate_string(
|
|
"Euphoria files (*.ex,*.exw,*.e,*.ew)"&0&"*.EX;*.EXW;*.E;*.EW;ex.err;eu.cfg"&0&
|
|
"Text or Document files (*.txt,*.doc)"&0&"*.TXT;*.DOC"&0&
|
|
"All files (*.*)"&0&"*.*"&0&0)
|
|
|
|
|
|
atom hMainWnd, hFindDlg, hDlg, class,
|
|
hmenu, hfilemenu, heditmenu, hsearchmenu, hviewmenu,
|
|
hrunmenu, hoptionsmenu, hhelpmenu, htabmenu,
|
|
hstatus, htabs, hcode, hedit, htooltip,
|
|
WM_FIND
|
|
|
|
sequence ui_hedits
|
|
ui_hedits = {}
|
|
|
|
class = 0
|
|
WM_FIND = 0
|
|
hMainWnd = 0 -- the main window
|
|
hFindDlg = 0
|
|
hDlg = 0
|
|
hedit = 0 -- the richedit control
|
|
hstatus = 0 -- the static control showing cursor position
|
|
htabs = 0 -- the tab control
|
|
hcode = 0 -- the listbox control for code completions
|
|
hedit = 0
|
|
|
|
constant tab_h = 24
|
|
|
|
|
|
x_pos = CW_USEDEFAULT
|
|
y_pos = CW_USEDEFAULT
|
|
x_size = CW_USEDEFAULT
|
|
y_size = CW_USEDEFAULT
|
|
|
|
constant
|
|
ansi_var_font = c_func(GetStockObject, {ANSI_VAR_FONT}),
|
|
ansi_fixed_font = c_func(GetStockObject, {ANSI_FIXED_FONT})
|
|
|
|
atom captionFont, smCaptionFont, menuFont, statusFont, messageFont
|
|
|
|
|
|
-- nifty shortcut, thanks Greg Haberek
|
|
function callback(sequence name, atom rid = routine_id(name))
|
|
return call_back(rid)
|
|
end function
|
|
|
|
|
|
global procedure ui_update_window_title(sequence name)
|
|
atom result
|
|
result = c_func(SendMessage, {hMainWnd, WM_SETTEXT, 0,
|
|
alloc_string(name & " ~ " & window_title)})
|
|
free_strings()
|
|
end procedure
|
|
|
|
global procedure ui_update_status(sequence status)
|
|
atom txt, junk
|
|
txt = allocate_string(status)
|
|
junk = c_func(SendMessage, {hstatus, WM_SETTEXT, 0, txt})
|
|
free(txt)
|
|
end procedure
|
|
|
|
global procedure ui_refresh_file_menu(sequence recent_files)
|
|
atom junk, count
|
|
count = c_func(GetMenuItemCount, {hfilemenu}) - 7
|
|
if count = 0 and length(recent_files) > 0 then
|
|
junk = c_func(AppendMenu, {hfilemenu, MF_BYPOSITION + MF_SEPARATOR, 0, 0})
|
|
end if
|
|
for i = 1 to length(recent_files) do
|
|
if i >= count then
|
|
junk = c_func(AppendMenu, {hfilemenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
File_Recent+i, alloc_string(recent_files[i])})
|
|
else
|
|
junk = c_func(ModifyMenu, {hfilemenu, i+7, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
File_Recent+i, alloc_string(recent_files[i])})
|
|
end if
|
|
end for
|
|
free_strings()
|
|
end procedure
|
|
|
|
global procedure ui_update_tab_name(integer tab, sequence name)
|
|
atom junk, tcitem
|
|
tcitem = allocate_pack("dddsiip", {TCIF_TEXT, 0, 0, name, 0, 0, 0})
|
|
junk = c_func(SendMessage, {htabs, TCM_SETITEMA, tab-1, tcitem})
|
|
free(tcitem)
|
|
free_strings()
|
|
end procedure
|
|
|
|
|
|
-- select the tab and show the hedit
|
|
global procedure ui_select_tab(integer tab)
|
|
atom junk, rect
|
|
integer w, h
|
|
|
|
-- change tab, and highlight it to make it stand out
|
|
junk = c_func(SendMessage, {htabs, TCM_HIGHLIGHTITEM,
|
|
c_func(SendMessage, {htabs, TCM_GETCURSEL, 0, 0}), 0})
|
|
junk = c_func(SendMessage, {htabs, TCM_SETCURSEL, tab-1, 0})
|
|
junk = c_func(SendMessage, {htabs, TCM_HIGHLIGHTITEM, tab-1, 1})
|
|
|
|
if hedit then
|
|
-- hide the previous hedit
|
|
c_proc(ShowWindow, {hedit, SW_HIDE})
|
|
end if
|
|
|
|
hedit = ui_hedits[tab]
|
|
|
|
-- update the richedit control to the window size
|
|
rect = allocate(16)
|
|
c_proc(GetClientRect, {hMainWnd, rect})
|
|
c_proc(MoveWindow, {hedit, 0, tab_h, peek4u(rect+8), peek4u(rect+12)-tab_h, 1})
|
|
free(rect)
|
|
c_proc(ShowWindow, {hedit, SW_SHOW})
|
|
junk = c_func(SetFocus, {hedit})
|
|
|
|
junk = allocate_pack("zdppddddps", { -- TOOLINFO
|
|
TTF_IDISHWND + TTF_SUBCLASS, -- uFlags
|
|
hMainWnd, -- hwnd
|
|
htabs, -- uId
|
|
0,0,0,0, -- rect
|
|
0, -- hinst
|
|
file_name -- lpszText
|
|
})
|
|
c_func(SendMessage, {htooltip, TTM_UPDATETIPTEXT, 0, junk})
|
|
free(junk)
|
|
|
|
end procedure
|
|
|
|
global function ui_new_tab(sequence name)
|
|
atom junk, tcitem, tab, hedit
|
|
tab = c_func(SendMessage, {htabs, TCM_GETITEMCOUNT, 0, 0})
|
|
|
|
tcitem = allocate_pack("dddsiip", {TCIF_TEXT, 0, 0, name, 0, 0, 0})
|
|
junk = c_func(SendMessage, {htabs, TCM_INSERTITEMA, tab+(tab!=0), tcitem})
|
|
free(tcitem)
|
|
free_strings()
|
|
|
|
hedit = CreateWindow({
|
|
0,
|
|
"Scintilla",
|
|
"",
|
|
{WS_CHILD, WS_VISIBLE, WS_TABSTOP, WS_CLIPCHILDREN},
|
|
0,0,0,0, -- position and size set later by hMainWnd
|
|
hMainWnd, NULL, 0, NULL})
|
|
|
|
-- save the window handle
|
|
ui_hedits = append(ui_hedits, hedit)
|
|
return c_func(SendMessage, {hedit, SCI_GETDIRECTPOINTER, 0, 0})
|
|
end function
|
|
|
|
global procedure ui_close_tab(integer tab)
|
|
atom junk
|
|
|
|
-- get the edit window handle and destroy it
|
|
junk = c_func(DestroyWindow, {hedit})
|
|
hedit = 0
|
|
-- delete the tab
|
|
junk = c_func(SendMessage, {htabs, TCM_DELETEITEM, tab-1, 0})
|
|
-- remove the window handle
|
|
ui_hedits = ui_hedits[1..tab-1] & ui_hedits[tab+1..$]
|
|
end procedure
|
|
|
|
procedure rightclick_tab()
|
|
atom point
|
|
integer tab, x, y
|
|
point = allocate(12)
|
|
c_func(GetCursorPos, {point})
|
|
x = peek4u(point)
|
|
y = peek4u(point+4)
|
|
c_func(ScreenToClient, {hMainWnd, point})
|
|
tab = c_func(SendMessage, {htabs, TCM_HITTEST, 0, point})
|
|
if tab >= 0 then
|
|
select_tab(tab + 1)
|
|
c_func(TrackPopupMenu, {htabmenu, TPM_LEFTALIGN, x, y, 0, hMainWnd, 0})
|
|
end if
|
|
free(point)
|
|
end procedure
|
|
|
|
|
|
integer current_filter
|
|
current_filter = 1
|
|
|
|
global function ui_get_open_file_name(integer multiple = 1)
|
|
sequence temp
|
|
temp = GetOpenFileName({hMainWnd, 0, file_filters, current_filter,
|
|
"", 0, 0,
|
|
OFN_EXPLORER + OFN_PATHMUSTEXIST + OFN_FILEMUSTEXIST + OFN_HIDEREADONLY
|
|
+ (multiple != 0) * OFN_ALLOWMULTISELECT
|
|
, 0})
|
|
if length(temp) < 2 then return "" end if
|
|
current_filter = temp[1]
|
|
return temp[2]
|
|
end function
|
|
|
|
global function ui_get_save_file_name(sequence file_name)
|
|
sequence temp
|
|
temp = GetSaveFileName({hMainWnd, 0, file_filters, current_filter,
|
|
file_name, 0, 0, OFN_EXPLORER + OFN_PATHMUSTEXIST + OFN_HIDEREADONLY, 0})
|
|
if length(temp) < 2 then return "" end if
|
|
current_filter = temp[1]
|
|
return temp[2]
|
|
end function
|
|
|
|
-- returns yes=1 no=0
|
|
global function ui_message_box_yes_no(sequence title, sequence message)
|
|
atom result
|
|
result = c_func(MessageBox, {hMainWnd,
|
|
alloc_string(message),
|
|
alloc_string(title),
|
|
or_all({MB_APPLMODAL, MB_ICONINFORMATION, MB_YESNO})})
|
|
free_strings()
|
|
return result = IDYES
|
|
end function
|
|
|
|
-- returns yes=1 no=0 cancel=-1
|
|
global function ui_message_box_yes_no_cancel(sequence title, sequence message)
|
|
atom result
|
|
result = c_func(MessageBox, {hMainWnd,
|
|
alloc_string(message),
|
|
alloc_string(title),
|
|
or_all({MB_APPLMODAL, MB_ICONINFORMATION, MB_YESNOCANCEL})})
|
|
free_strings()
|
|
return (result = IDYES) - (result = IDCANCEL)
|
|
end function
|
|
|
|
global function ui_message_box_error(sequence title, sequence message)
|
|
atom result
|
|
result = c_func(MessageBox, {hMainWnd,
|
|
alloc_string(message),
|
|
alloc_string(title),
|
|
or_all({MB_APPLMODAL, MB_ICONSTOP, MB_OK})})
|
|
free_strings()
|
|
return result
|
|
end function
|
|
|
|
procedure get_window_size()
|
|
atom rect
|
|
rect = allocate(16)
|
|
c_proc(GetWindowRect, {hMainWnd, rect})
|
|
x_pos = peek4u(rect)
|
|
y_pos = peek4u(rect+4)
|
|
x_size = peek4u(rect+8) - x_pos
|
|
y_size = peek4u(rect+12) - y_pos
|
|
free(rect)
|
|
end procedure
|
|
|
|
|
|
procedure about_box()
|
|
atom result
|
|
result = c_func(MessageBox, {hMainWnd,
|
|
alloc_string(window_title&"\n\nVersion "&version&"\n\nBy "&author),
|
|
alloc_string("About "&window_title),
|
|
or_all({MB_APPLMODAL, MB_ICONINFORMATION, MB_OK})})
|
|
free_strings()
|
|
end procedure
|
|
|
|
constant
|
|
DialogListID = 1000,
|
|
DialogLabelID = 1001,
|
|
DialogEditID = 1002,
|
|
DialogOpenID = 1003
|
|
sequence subs
|
|
|
|
function SubsDialogProc(atom hdlg, atom iMsg, atom wParam, atom lParam)
|
|
atom junk, hList, pos
|
|
sequence text, word, tmp
|
|
|
|
--? {hdlg, iMsg, wParam, HIWORD(lParam), LOWORD(lParam)}
|
|
|
|
if iMsg = WM_INITDIALOG then
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, IDOK}),
|
|
WM_SETFONT, captionFont, 0})
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, IDCANCEL}),
|
|
WM_SETFONT, captionFont, 0})
|
|
hList = c_func(GetDlgItem, {hdlg, DialogListID})
|
|
junk = c_func(SendMessage, {hList, WM_SETFONT, messageFont, 0})
|
|
text = get_edit_text()
|
|
pos = get_pos()
|
|
word = word_pos(text, pos)
|
|
subs = get_subroutines(parse(text, file_name))
|
|
if sorted_subs then
|
|
subs = sort(subs)
|
|
end if
|
|
|
|
for i = 1 to length(subs) do
|
|
junk = c_func(SendMessage, {hList, LB_ADDSTRING, 0, alloc_string(subs[i][1])})
|
|
if equal(word[1], subs[i][1]) then
|
|
junk = c_func(SendMessage, {hList, LB_SETCURSEL, i-1, 0})
|
|
end if
|
|
end for
|
|
free_strings()
|
|
|
|
elsif iMsg = WM_COMMAND then
|
|
if LOWORD(wParam) = IDOK then
|
|
hList = c_func(GetDlgItem, {hdlg, DialogListID})
|
|
pos = c_func(SendMessage, {hList, LB_GETCURSEL, 0, 0})+1
|
|
if pos >= 1 and pos <= length(subs) then
|
|
word = subs[pos][1]
|
|
pos = subs[pos][2]-1
|
|
--printf(1, "%s: pos=%d line=%d\n", {word, pos,
|
|
-- c_func(SendMessage, {hedit, SCI_LINEFROMPOSITION, pos, 0})})
|
|
junk = c_func(SendMessage, {hedit, SCI_SETSEL, pos, pos+length(word)})
|
|
set_top_line(-1) -- set the top visible line to the current line
|
|
end if
|
|
junk = c_func(EndDialog, {hdlg, 1})
|
|
return 1
|
|
elsif LOWORD(wParam) = IDCANCEL then
|
|
junk = c_func(EndDialog, {hdlg, 0})
|
|
return 1
|
|
end if
|
|
|
|
elsif iMsg = WM_CLOSE then --closing dialog
|
|
junk = c_func(EndDialog, {hdlg, 0})
|
|
end if
|
|
|
|
return 0
|
|
end function
|
|
|
|
constant SubsDialogCallback = callback("SubsDialogProc")
|
|
|
|
-- used for struct DLGITEMTEMPLATE
|
|
constant
|
|
DIALOG_CLASS_BUTTON = #0080,
|
|
DIALOG_CLASS_EDIT = #0081,
|
|
DIALOG_CLASS_STATIC = #0082,
|
|
DIALOG_CLASS_LIST = #0083,
|
|
DIALOG_CLASS_SCROLLBAR = #0084,
|
|
DIALOG_CLASS_COMBOBOX = #0085
|
|
|
|
procedure view_subroutines()
|
|
atom junk
|
|
junk = DialogBoxIndirectParam(c_func(GetModuleHandle, {NULL}), {
|
|
--DLGTEMPLATE{style, exstyle, x, y, cx, cy, menu, wndclass, text}
|
|
{{WS_POPUP, WS_BORDER, WS_SYSMENU, DS_MODALFRAME, WS_CAPTION}, 0,
|
|
50,50, 100,124, 0, 0, "Subroutines"},
|
|
--DLGITEMTEMPLATE{style, exstyle, x, y, cx, cy, id, dlgclass, text}
|
|
{{WS_CHILD, WS_VISIBLE, WS_VSCROLL}, WS_EX_CLIENTEDGE,
|
|
4,4, 92,110, DialogListID, DIALOG_CLASS_LIST, "ListBox"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
4,108, 44,12, IDCANCEL, DIALOG_CLASS_BUTTON, "Cancel"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_DEFPUSHBUTTON}, 0,
|
|
52,108, 44,12, IDOK, DIALOG_CLASS_BUTTON, "OK"}
|
|
},
|
|
hMainWnd,
|
|
SubsDialogCallback,
|
|
0)
|
|
subs = {}
|
|
end procedure
|
|
|
|
|
|
sequence err
|
|
|
|
function ViewErrorProc(atom hdlg, atom iMsg, atom wParam, atom lParam)
|
|
atom junk, hList, hLabel, pos, len, item
|
|
|
|
--? {hdlg, iMsg, wParam, HIWORD(lParam), LOWORD(lParam)}
|
|
|
|
if iMsg = WM_INITDIALOG then
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, IDOK}),
|
|
WM_SETFONT, captionFont, 0})
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, IDCANCEL}),
|
|
WM_SETFONT, captionFont, 0})
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, IDRETRY}),
|
|
WM_SETFONT, captionFont, 0})
|
|
hList = c_func(GetDlgItem, {hdlg, DialogListID})
|
|
junk = c_func(SendMessage, {hList, WM_SETFONT, messageFont, 0})
|
|
hLabel = c_func(GetDlgItem, {hdlg, DialogLabelID})
|
|
junk = c_func(SendMessage, {hLabel, WM_SETFONT, messageFont, 0})
|
|
|
|
err = get_ex_err()
|
|
if length(err) = 0 then
|
|
junk = c_func(EndDialog, {hdlg, 0})
|
|
return 1
|
|
end if
|
|
junk = c_func(SendMessage, {hLabel, WM_SETTEXT, 0, alloc_string(err[2])})
|
|
|
|
for i = 3 to length(err) do
|
|
junk = c_func(SendMessage, {hList, LB_ADDSTRING, 0, alloc_string(err[i])})
|
|
end for
|
|
junk = c_func(SendMessage, {hList, LB_SETCURSEL, 0, 0})
|
|
junk = c_func(SetFocus, {hList})
|
|
|
|
elsif iMsg = WM_COMMAND then
|
|
if LOWORD(wParam) = IDOK then
|
|
hList = c_func(GetDlgItem, {hdlg, DialogListID})
|
|
pos = c_func(SendMessage, {hList, LB_GETCURSEL, 0, 0})
|
|
if pos != -1 then
|
|
goto_error(err, pos+1)
|
|
end if
|
|
junk = c_func(EndDialog, {hdlg, 1})
|
|
return 1
|
|
elsif LOWORD(wParam) = IDRETRY then
|
|
open_file(ex_err_name, 1)
|
|
junk = c_func(EndDialog, {hdlg, 0})
|
|
return 1
|
|
elsif LOWORD(wParam) = IDCANCEL then
|
|
junk = c_func(EndDialog, {hdlg, 0})
|
|
return 1
|
|
end if
|
|
|
|
elsif iMsg = WM_CLOSE then --closing dialog
|
|
junk = c_func(EndDialog, {hdlg, 0})
|
|
end if
|
|
|
|
return 0
|
|
end function
|
|
|
|
constant ViewErrorCallback = callback("ViewErrorProc")
|
|
|
|
global procedure ui_view_error()
|
|
integer junk
|
|
junk = DialogBoxIndirectParam(c_func(GetModuleHandle, {NULL}), {
|
|
--DLGTEMPLATE{style, exstyle, x, y, cx, cy, menu, wndclass, text}
|
|
{{WS_POPUP, WS_CAPTION, WS_SYSMENU, DS_MODALFRAME}, 0,
|
|
50, 50, 200,150, 0, 0, "View Error"},
|
|
--DLGITEMTEMPLATE{style, exstyle, x, y, cx, cy, id, dlgclass, text}
|
|
{{WS_CHILD, WS_VISIBLE, WS_VSCROLL}, WS_EX_CLIENTEDGE,
|
|
4,24, 192,108, DialogListID, DIALOG_CLASS_LIST, "ListBox"},
|
|
{{WS_CHILD, WS_VISIBLE}, 0,
|
|
4,4, 192,20, DialogLabelID, DIALOG_CLASS_STATIC, "Static"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
54,132, 44,12, IDCANCEL, DIALOG_CLASS_BUTTON, "Cancel"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
102,132, 44,12, IDRETRY, DIALOG_CLASS_BUTTON, "Open ex.err"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_DEFPUSHBUTTON}, 0,
|
|
150,132, 44,12, IDOK, DIALOG_CLASS_BUTTON, "Goto Error"}
|
|
},
|
|
hMainWnd,
|
|
ViewErrorCallback,
|
|
0)
|
|
end procedure
|
|
|
|
global procedure ui_show_help(sequence html)
|
|
-- TODO
|
|
end procedure
|
|
|
|
global procedure ui_show_uri(sequence uri)
|
|
atom result
|
|
-- TODO: get default browser from
|
|
-- HKEY_LOCAL_MACHINE\SOFTWARE\Classes\http\shell\open\command
|
|
-- note: just opening the uri won't work, since shellexecute will
|
|
-- strip off any #anchor text, so using iexplore.exe for now
|
|
result = c_func(ShellExecute, {
|
|
hMainWnd, NULL,
|
|
alloc_string("iexplore.exe"),
|
|
alloc_string(uri),
|
|
NULL,
|
|
SW_SHOWNORMAL})
|
|
free_strings()
|
|
end procedure
|
|
|
|
|
|
procedure process_find(atom struc)
|
|
atom flags, junk, result
|
|
integer backward
|
|
|
|
flags = GetFindFlags(struc)
|
|
if and_bits(flags, FR_DIALOGTERM) then
|
|
find_phrase = GetFindWhat(struc)
|
|
replace_phrase = GetReplaceWith(struc)
|
|
--puts(1, find_phrase&" "&replace_phrase&"\n")
|
|
hFindDlg = 0
|
|
return
|
|
end if
|
|
--printf(1, "flags=%x\n", {flags})
|
|
|
|
backward = not and_bits(flags, FR_DOWN)
|
|
result = 0
|
|
if and_bits(flags, FR_MATCHCASE) then
|
|
result += SCFIND_MATCHCASE
|
|
end if
|
|
if and_bits(flags, FR_WHOLEWORD) then
|
|
result += SCFIND_WHOLEWORD
|
|
end if
|
|
junk = c_func(SendMessage, {hedit, SCI_SETSEARCHFLAGS, result, 0})
|
|
|
|
if and_bits(flags, FR_FINDNEXT) then
|
|
if search_find(GetFindWhat(struc), backward) = 0 then
|
|
result = c_func(MessageBox, {hFindDlg,
|
|
alloc_string("Unable to find a match."),
|
|
alloc_string("Find"),
|
|
or_all({MB_APPLMODAL, MB_ICONINFORMATION, MB_OK})})
|
|
end if
|
|
elsif and_bits(flags, FR_REPLACE) then
|
|
result = search_replace(GetReplaceWith(struc))
|
|
if search_find(GetFindWhat(struc), backward) = 0 and result = 0 then
|
|
result = c_func(MessageBox, {hFindDlg,
|
|
alloc_string("Unable to find a match."),
|
|
alloc_string("Replace"),
|
|
or_all({MB_APPLMODAL, MB_ICONINFORMATION, MB_OK})})
|
|
end if
|
|
elsif and_bits(flags, FR_REPLACEALL) then
|
|
result = search_replace_all(GetFindWhat(struc), GetReplaceWith(struc))
|
|
if result then
|
|
result = c_func(MessageBox, {hFindDlg,
|
|
alloc_string(sprintf("%d replacements.", {result})),
|
|
alloc_string("Replace All"),
|
|
or_all({MB_APPLMODAL, MB_ICONINFORMATION, MB_OK})})
|
|
else
|
|
result = c_func(MessageBox, {hFindDlg,
|
|
alloc_string("Unable to find a match."),
|
|
alloc_string("Replace All"),
|
|
or_all({MB_APPLMODAL, MB_ICONINFORMATION, MB_OK})})
|
|
end if
|
|
end if
|
|
free_strings()
|
|
end procedure
|
|
|
|
|
|
function RunArgsProc(atom hdlg, atom iMsg, atom wParam, atom lParam)
|
|
atom junk, hEdit, len, buf
|
|
|
|
--? {hdlg, iMsg, wParam, HIWORD(lParam), LOWORD(lParam)}
|
|
|
|
if iMsg = WM_INITDIALOG then
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, IDOK}),
|
|
WM_SETFONT, captionFont, 0})
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, IDCANCEL}),
|
|
WM_SETFONT, captionFont, 0})
|
|
hEdit = c_func(GetDlgItem, {hdlg, DialogEditID})
|
|
junk = c_func(SendMessage, {hEdit, WM_SETFONT, messageFont, 0})
|
|
|
|
junk = c_func(SendMessage, {hEdit, WM_SETTEXT, 0, alloc_string(get_tab_arguments())})
|
|
junk = c_func(SetFocus, {hEdit})
|
|
junk = c_func(SendMessage, {hEdit, EM_SETSEL, 0, -1})
|
|
|
|
elsif iMsg = WM_COMMAND then
|
|
if LOWORD(wParam) = IDOK then
|
|
hEdit = c_func(GetDlgItem, {hdlg, DialogEditID})
|
|
len = 1 + c_func(SendMessage, {hEdit, WM_GETTEXTLENGTH, 0, 0})
|
|
buf = allocate(len)
|
|
junk = c_func(SendMessage, {hEdit, WM_GETTEXT, len, buf})
|
|
junk = c_func(EndDialog, {hdlg, buf})
|
|
return 1
|
|
elsif LOWORD(wParam) = IDCANCEL then
|
|
junk = c_func(EndDialog, {hdlg, 0})
|
|
return 1
|
|
end if
|
|
|
|
elsif iMsg = WM_CLOSE then --closing dialog
|
|
junk = c_func(EndDialog, {hdlg, 0})
|
|
end if
|
|
|
|
return 0
|
|
end function
|
|
|
|
constant RunArgsCallback = callback("RunArgsProc")
|
|
|
|
global procedure run_arguments()
|
|
integer junk
|
|
junk = DialogBoxIndirectParam(c_func(GetModuleHandle, {NULL}), {
|
|
--DLGTEMPLATE{style, exstyle, x, y, cx, cy, menu, wndclass, text}
|
|
{{WS_POPUP, WS_CAPTION, WS_SYSMENU, DS_MODALFRAME}, 0,
|
|
50,50, 200,36, 0, 0, "Set Arguments"},
|
|
--DLGITEMTEMPLATE{style, exstyle, x, y, cx, cy, id, dlgclass, text}
|
|
{{WS_CHILD, WS_VISIBLE, WS_BORDER, ES_AUTOHSCROLL}, 0,
|
|
4,4, 192,12, DialogEditID, DIALOG_CLASS_EDIT, "tab arguments"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
104,20, 44,12, IDCANCEL, DIALOG_CLASS_BUTTON, "Cancel"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_DEFPUSHBUTTON}, 0,
|
|
152,20, 44,12, IDOK, DIALOG_CLASS_BUTTON, "OK"}
|
|
},
|
|
hMainWnd,
|
|
RunArgsCallback,
|
|
0)
|
|
if junk then
|
|
set_tab_arguments(peek_string(junk))
|
|
free(junk)
|
|
end if
|
|
end procedure
|
|
|
|
|
|
function RunInterpreterProc(atom hdlg, atom iMsg, atom wParam, atom lParam)
|
|
atom junk, hEdit, hLabel, len, buf
|
|
sequence interpreters
|
|
integer index
|
|
|
|
--? {hdlg, iMsg, wParam, HIWORD(lParam), LOWORD(lParam)}
|
|
|
|
if iMsg = WM_INITDIALOG then
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, IDOK}),
|
|
WM_SETFONT, captionFont, 0})
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, IDCANCEL}),
|
|
WM_SETFONT, captionFont, 0})
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, DialogOpenID}),
|
|
WM_SETFONT, captionFont, 0})
|
|
hLabel = c_func(GetDlgItem, {hdlg, DialogLabelID})
|
|
junk = c_func(SendMessage, {hLabel, WM_SETFONT, messageFont, 0})
|
|
hEdit = c_func(GetDlgItem, {hdlg, DialogEditID})
|
|
junk = c_func(SendMessage, {hEdit, WM_SETFONT, messageFont, 0})
|
|
|
|
interpreters = get_interpreters()
|
|
for i = 1 to length(interpreters) do
|
|
junk = c_func(SendMessage, {hEdit, CB_ADDSTRING, 0, alloc_string(interpreters[i])})
|
|
end for
|
|
index = find(interpreter, interpreters)
|
|
if index then
|
|
junk = c_func(SendMessage, {hEdit, CB_SETCURSEL, index-1, 0})
|
|
end if
|
|
|
|
junk = c_func(SetFocus, {hEdit})
|
|
junk = c_func(SendMessage, {hEdit, EM_SETSEL, 0, -1})
|
|
|
|
elsif iMsg = WM_COMMAND then
|
|
if LOWORD(wParam) = DialogOpenID then
|
|
sequence temp = GetOpenFileName({hMainWnd, 0, alloc_string("Executable Files (*.exe)"&0&"*.EXE"&0&0), 0,
|
|
"", 0, 0,
|
|
OFN_EXPLORER + OFN_PATHMUSTEXIST + OFN_FILEMUSTEXIST + OFN_HIDEREADONLY
|
|
, 0})
|
|
if length(temp) then
|
|
temp = temp[2] -- just the filename
|
|
hEdit = c_func(GetDlgItem, {hdlg, DialogEditID})
|
|
junk = c_func(SendMessage, {hEdit, CB_SELECTSTRING, -1, alloc_string(temp)})
|
|
if junk = CB_ERR then
|
|
-- add a new filename since it wasn't found
|
|
junk = c_func(SendMessage, {hEdit, CB_INSERTSTRING, 0, alloc_string(temp)})
|
|
junk = c_func(SendMessage, {hEdit, CB_SETCURSEL, 0, 0})
|
|
end if
|
|
end if
|
|
free_strings()
|
|
elsif LOWORD(wParam) = IDOK then
|
|
hEdit = c_func(GetDlgItem, {hdlg, DialogEditID})
|
|
len = 1 + c_func(SendMessage, {hEdit, WM_GETTEXTLENGTH, 0, 0})
|
|
buf = allocate(len)
|
|
junk = c_func(SendMessage, {hEdit, WM_GETTEXT, len, buf})
|
|
junk = c_func(EndDialog, {hdlg, buf})
|
|
return 1
|
|
elsif LOWORD(wParam) = IDCANCEL then
|
|
junk = c_func(EndDialog, {hdlg, 0})
|
|
return 1
|
|
end if
|
|
|
|
elsif iMsg = WM_CLOSE then --closing dialog
|
|
junk = c_func(EndDialog, {hdlg, 0})
|
|
end if
|
|
|
|
return 0
|
|
end function
|
|
|
|
constant RunInterpreterCallback = callback("RunInterpreterProc")
|
|
|
|
global procedure run_interpreter()
|
|
integer junk
|
|
junk = DialogBoxIndirectParam(c_func(GetModuleHandle, {NULL}), {
|
|
--DLGTEMPLATE{style, exstyle, x, y, cx, cy, menu, wndclass, text}
|
|
{{WS_POPUP, WS_CAPTION, WS_SYSMENU, DS_MODALFRAME}, 0,
|
|
50,50, 200,56, 0, 0, "Set Interpreter"},
|
|
--DLGITEMTEMPLATE{style, exstyle, x, y, cx, cy, id, dlgclass, text}
|
|
{{WS_CHILD, WS_VISIBLE}, 0,
|
|
4,4, 192,20, DialogLabelID, DIALOG_CLASS_STATIC,
|
|
"Enter an interpreter to use to run programs, or select one from the list.\n"&
|
|
"Leave blank to use the default first item in the list."},
|
|
{{WS_CHILD, WS_VISIBLE, WS_BORDER, WS_HSCROLL, CBS_AUTOHSCROLL, CBS_DROPDOWN}, 0,
|
|
4,24, 176,12, DialogEditID, DIALOG_CLASS_COMBOBOX, "interpreter"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
184,24, 12,12, DialogOpenID, DIALOG_CLASS_BUTTON, "..."},
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
104,40, 44,12, IDCANCEL, DIALOG_CLASS_BUTTON, "Cancel"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_DEFPUSHBUTTON}, 0,
|
|
152,40, 44,12, IDOK, DIALOG_CLASS_BUTTON, "OK"}
|
|
},
|
|
hMainWnd,
|
|
RunInterpreterCallback,
|
|
0)
|
|
if junk then
|
|
interpreter = peek_string(junk)
|
|
free(junk)
|
|
end if
|
|
end procedure
|
|
|
|
procedure run_start(integer with_args)
|
|
atom result
|
|
sequence args
|
|
|
|
-- save, no confirm
|
|
if save_if_modified(0) = 0 or length(file_name) = 0 then
|
|
return -- cancelled, or no name
|
|
end if
|
|
|
|
run_file_name = file_name
|
|
reset_ex_err()
|
|
|
|
args = quote_spaces(run_file_name)
|
|
if with_args then
|
|
if length(get_tab_arguments()) = 0 then
|
|
run_arguments()
|
|
end if
|
|
args &= ' ' & get_tab_arguments()
|
|
end if
|
|
|
|
-- if interpreter is set, use it
|
|
-- elsif Eu file and eu.cfg points to eudir use it (.exw,.ew->euiw,exw, .ex,.e->eui,ex)
|
|
-- else let OS handle it
|
|
-- and if that fails use EUDIR or include_paths
|
|
|
|
result = c_func(ShellExecute, {
|
|
hMainWnd, NULL,
|
|
alloc_string(get_eu_bin("")),
|
|
alloc_string(args),
|
|
alloc_string(dirname(run_file_name)),
|
|
SW_SHOWNORMAL})
|
|
if result < 33 then
|
|
-- shellexecute failed
|
|
if match(".exw", lower(run_file_name)) or
|
|
match(".ew", lower(run_file_name)) then
|
|
system(quote_spaces(get_eu_bin("euiw")) & ' ' & args)
|
|
else
|
|
system(quote_spaces(get_eu_bin("eui")) & ' ' & args)
|
|
end if
|
|
end if
|
|
free_strings()
|
|
end procedure
|
|
|
|
procedure run_convert(sequence name, sequence cmd)
|
|
atom result
|
|
|
|
-- save, no confirm
|
|
if save_if_modified(0) = 0 or length(file_name) = 0 then
|
|
return -- cancelled, or no name
|
|
end if
|
|
result = c_func(ShellExecute, {
|
|
hMainWnd, NULL,
|
|
alloc_string(get_eu_bin(cmd)),
|
|
alloc_string(quote_spaces(file_name)),
|
|
alloc_string(dirname(file_name)),
|
|
SW_SHOWNORMAL})
|
|
if result < 33 then
|
|
ui_message_box_error(name, cmd & " failed")
|
|
end if
|
|
end procedure
|
|
|
|
function get_appdata_path()
|
|
atom junk, path
|
|
sequence appdata
|
|
path = allocate(MAX_PATH)
|
|
junk = c_func(SHGetFolderPath, {
|
|
NULL,
|
|
CSIDL_LOCAL_APPDATA + CSIDL_FLAG_CREATE,
|
|
NULL,
|
|
0,
|
|
path})
|
|
appdata = peek_string(path)
|
|
free(path)
|
|
return appdata
|
|
end function
|
|
|
|
constant wee_conf_filename = get_appdata_path() & "\\wee_conf.txt"
|
|
|
|
|
|
function ColorsDialogProc(atom hdlg, atom iMsg, atom wParam, atom lParam)
|
|
atom junk, hEdit, len, buf
|
|
integer id
|
|
|
|
--? {hdlg, iMsg, wParam, HIWORD(lParam), LOWORD(lParam)}
|
|
|
|
if iMsg = WM_INITDIALOG then
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, IDOK}),
|
|
WM_SETFONT, captionFont, 0})
|
|
for i = 1000 to 1016 do
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, i}),
|
|
WM_SETFONT, captionFont, 0})
|
|
end for
|
|
for i = 0 to 6 do
|
|
if and_bits(bold_flags, power(2, i)) then
|
|
junk = BST_CHECKED
|
|
else
|
|
junk = BST_UNCHECKED
|
|
end if
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, 1010+i}),
|
|
BM_SETCHECK, junk, 0})
|
|
end for
|
|
|
|
elsif iMsg = WM_COMMAND then
|
|
id = LOWORD(wParam)
|
|
if id = IDOK then
|
|
junk = c_func(EndDialog, {hdlg, 1})
|
|
return 1
|
|
elsif id = IDCANCEL then
|
|
junk = c_func(EndDialog, {hdlg, 0})
|
|
return 1
|
|
elsif id = 1000 then
|
|
normal_color = ChooseColor(hMainWnd, normal_color)
|
|
reinit_all_edits()
|
|
return 0
|
|
elsif id = 1001 then
|
|
background_color = ChooseColor(hMainWnd, background_color)
|
|
reinit_all_edits()
|
|
return 0
|
|
elsif id = 1002 then
|
|
comment_color = ChooseColor(hMainWnd, comment_color)
|
|
reinit_all_edits()
|
|
return 0
|
|
elsif id = 1003 then
|
|
string_color = ChooseColor(hMainWnd, string_color)
|
|
reinit_all_edits()
|
|
return 0
|
|
elsif id = 1004 then
|
|
keyword_color = ChooseColor(hMainWnd, keyword_color)
|
|
reinit_all_edits()
|
|
return 0
|
|
elsif id = 1005 then
|
|
builtin_color = ChooseColor(hMainWnd, builtin_color)
|
|
reinit_all_edits()
|
|
return 0
|
|
elsif id = 1006 then
|
|
number_color = ChooseColor(hMainWnd, number_color)
|
|
reinit_all_edits()
|
|
return 0
|
|
elsif id = 1007 then
|
|
bracelight_color = ChooseColor(hMainWnd, bracelight_color)
|
|
reinit_all_edits()
|
|
return 0
|
|
elsif id = 1008 then
|
|
linenumber_color = ChooseColor(hMainWnd, linenumber_color)
|
|
reinit_all_edits()
|
|
return 0
|
|
elsif id >= 1010 and id <= 1016 then
|
|
junk = power(2, id - 1010)
|
|
if and_bits(bold_flags, junk) then
|
|
bold_flags = and_bits(bold_flags, not_bits(junk))
|
|
junk = BST_UNCHECKED
|
|
else
|
|
bold_flags = or_bits(bold_flags, junk)
|
|
junk = BST_CHECKED
|
|
end if
|
|
junk = c_func(SendMessage, {
|
|
c_func(GetDlgItem, {hdlg, id}), BM_SETCHECK, junk, 0})
|
|
reinit_all_edits()
|
|
return 0
|
|
end if
|
|
|
|
elsif iMsg = WM_CLOSE then --closing dialog
|
|
junk = c_func(EndDialog, {hdlg, 0})
|
|
end if
|
|
|
|
return 0
|
|
end function
|
|
|
|
constant ColorsDialogCallback = callback("ColorsDialogProc")
|
|
|
|
global procedure choose_colors()
|
|
integer junk
|
|
junk = DialogBoxIndirectParam(c_func(GetModuleHandle, {NULL}), {
|
|
--DLGTEMPLATE{style, exstyle, x, y, cx, cy, menu, wndclass, text}
|
|
{{WS_POPUP, WS_CAPTION, WS_SYSMENU, DS_MODALFRAME}, 0,
|
|
50,50, 100,166, 0, 0, "Colors"},
|
|
--DLGITEMTEMPLATE{style, exstyle, x, y, cx, cy, id, dlgclass, text}
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
4,4, 64,12, 1000, DIALOG_CLASS_BUTTON, "Normal"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
4,20, 64,12, 1001, DIALOG_CLASS_BUTTON, "Background"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
4,36, 64,12, 1002, DIALOG_CLASS_BUTTON, "Comment"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
4,52, 64,12, 1003, DIALOG_CLASS_BUTTON, "String"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
4,68, 64,12, 1004, DIALOG_CLASS_BUTTON, "Keyword"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
4,84, 64,12, 1005, DIALOG_CLASS_BUTTON, "Built-in"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
4,100, 64,12, 1006, DIALOG_CLASS_BUTTON, "Number"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
4,116, 64,12, 1007, DIALOG_CLASS_BUTTON, "Brace Highlight"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
4,132, 64,12, 1008, DIALOG_CLASS_BUTTON, "Line Number"},
|
|
|
|
|
|
{{WS_CHILD, WS_VISIBLE, BS_CHECKBOX}, 0,
|
|
72,4, 32,12, 1010, DIALOG_CLASS_BUTTON, "Bold"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_CHECKBOX}, 0,
|
|
72,36, 32,12, 1011, DIALOG_CLASS_BUTTON, "Bold"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_CHECKBOX}, 0,
|
|
72,52, 32,12, 1012, DIALOG_CLASS_BUTTON, "Bold"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_CHECKBOX}, 0,
|
|
72,68, 32,12, 1013, DIALOG_CLASS_BUTTON, "Bold"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_CHECKBOX}, 0,
|
|
72,84, 32,12, 1014, DIALOG_CLASS_BUTTON, "Bold"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_CHECKBOX}, 0,
|
|
72,100, 32,12, 1015, DIALOG_CLASS_BUTTON, "Bold"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_CHECKBOX}, 0,
|
|
72,116, 32,12, 1016, DIALOG_CLASS_BUTTON, "Bold"},
|
|
|
|
{{WS_CHILD, WS_VISIBLE, BS_DEFPUSHBUTTON}, 0,
|
|
4,150, 44,12, IDOK, DIALOG_CLASS_BUTTON, "Close"}
|
|
},
|
|
hMainWnd,
|
|
ColorsDialogCallback,
|
|
0)
|
|
end procedure
|
|
|
|
function icon_from_xpm(sequence xpm)
|
|
sequence colors = repeat(0,255), pixels = {}, andbits = {}
|
|
integer w = 0, h = 0, clear = 0
|
|
atom buf, handle, mask, iconinfo, hbmMask, hbmColor
|
|
|
|
for i = 2 to length(xpm) do
|
|
if length(xpm[i]) >= 6 and xpm[i][3] = 'c' then
|
|
if equal(xpm[i][5..$], "None") then
|
|
clear = xpm[i][1]
|
|
else
|
|
colors[xpm[i][1]] = value(xpm[i][5..$])
|
|
end if
|
|
else
|
|
w = length(xpm[i])
|
|
h += 1
|
|
for j = 1 to length(xpm[i]) do
|
|
if remainder(j, 8) = 1 then
|
|
andbits &= 0
|
|
end if
|
|
if xpm[i][j] = clear then
|
|
andbits[$] = or_bits(andbits[$], power(2, 7-and_bits(j-1,7)))
|
|
pixels &= 0
|
|
else
|
|
pixels &= #FF000000 + colors[xpm[i][j]][2]
|
|
end if
|
|
end for
|
|
end if
|
|
end for
|
|
mask = allocate(length(andbits))
|
|
poke(mask, andbits)
|
|
buf = allocate(length(pixels)*4)
|
|
poke4(buf, pixels)
|
|
hbmMask = c_func(CreateBitmap, {w, h, 1, 1, mask})
|
|
hbmColor = c_func(CreateBitmap, {w, h, 1, 32, buf})
|
|
iconinfo = allocate_pack("iddpp", {1,0,0,hbmMask,hbmColor})
|
|
handle = c_func(CreateIconIndirect, {iconinfo})
|
|
c_func(DeleteObject, {hbmMask})
|
|
c_func(DeleteObject, {hbmColor})
|
|
free(buf)
|
|
free(mask)
|
|
free(iconinfo)
|
|
|
|
return handle
|
|
end function
|
|
|
|
include weeicon.e
|
|
constant wee_icon = icon_from_xpm(wee_xpm)
|
|
|
|
function IndentDialogProc(atom hdlg, atom iMsg, atom wParam, atom lParam)
|
|
atom junk, len, buf
|
|
integer id, tab_width, indent_width, use_tabs, check
|
|
sequence val
|
|
|
|
--? {hdlg, iMsg, wParam, HIWORD(lParam), LOWORD(lParam)}
|
|
|
|
if iMsg = WM_INITDIALOG then
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, IDOK}),
|
|
WM_SETFONT, captionFont, 0})
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, IDCANCEL}),
|
|
WM_SETFONT, captionFont, 0})
|
|
for i = 1000 to 1005 do
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, i}),
|
|
WM_SETFONT, captionFont, 0})
|
|
end for
|
|
hDlg = hdlg
|
|
|
|
tab_width = c_func(SendMessage, {hedit, SCI_GETTABWIDTH, 0, 0})
|
|
indent_width = c_func(SendMessage, {hedit, SCI_GETINDENT, 0, 0})
|
|
use_tabs = c_func(SendMessage, {hedit, SCI_GETUSETABS, 0, 0})
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, 1001}),
|
|
WM_SETTEXT, 0, alloc_string(sprintf("%d", {tab_width}))})
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, 1003}),
|
|
WM_SETTEXT, 0, alloc_string(sprintf("%d", {indent_width}))})
|
|
|
|
if use_tabs then
|
|
check = BST_CHECKED
|
|
else
|
|
check = BST_UNCHECKED
|
|
end if
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, 1004}),
|
|
BM_SETCHECK, check, 0})
|
|
if indentation_guides then
|
|
check = BST_CHECKED
|
|
else
|
|
check = BST_UNCHECKED
|
|
end if
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, 1005}),
|
|
BM_SETCHECK, check, 0})
|
|
|
|
elsif iMsg = WM_COMMAND then
|
|
id = LOWORD(wParam)
|
|
if id = IDOK then
|
|
buf = allocate(16)
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, 1001}),
|
|
WM_GETTEXT, 16, buf})
|
|
val = value(peek_string(buf))
|
|
if val[1] = 0 and integer(val[2]) then
|
|
tab_width = val[2]
|
|
else
|
|
tab_width = 0
|
|
end if
|
|
junk = c_func(SendMessage, {c_func(GetDlgItem, {hdlg, 1003}),
|
|
WM_GETTEXT, 16, buf})
|
|
val = value(peek_string(buf))
|
|
if val[1] = 0 and integer(val[2]) then
|
|
indent_width = val[2]
|
|
else
|
|
indent_width = 0
|
|
end if
|
|
free(buf)
|
|
|
|
if indent_width < 1 or indent_width > 8 or
|
|
tab_width < 1 or tab_width > 8 then
|
|
return 0
|
|
end if
|
|
|
|
use_tabs = BST_CHECKED = c_func(SendMessage, {
|
|
c_func(GetDlgItem, {hdlg, 1004}), BM_GETCHECK, 0, 0})
|
|
indentation_guides = BST_CHECKED = c_func(SendMessage, {
|
|
c_func(GetDlgItem, {hdlg, 1005}), BM_GETCHECK, 0, 0})
|
|
|
|
junk = c_func(SendMessage, {hedit, SCI_SETTABWIDTH, tab_width, 0})
|
|
junk = c_func(SendMessage, {hedit, SCI_SETINDENT, indent_width, 0})
|
|
junk = c_func(SendMessage, {hedit, SCI_SETUSETABS, use_tabs, 0})
|
|
reinit_all_edits()
|
|
|
|
junk = c_func(EndDialog, {hdlg, 1})
|
|
return 1
|
|
elsif id = IDCANCEL then
|
|
junk = c_func(EndDialog, {hdlg, 0})
|
|
return 1
|
|
elsif id = 1004 or id = 1005 then
|
|
junk = c_func(SendMessage, {
|
|
c_func(GetDlgItem, {hdlg, id}), BM_GETCHECK, 0, 0})
|
|
if junk = BST_CHECKED then
|
|
junk = BST_UNCHECKED
|
|
else
|
|
junk = BST_CHECKED
|
|
end if
|
|
junk = c_func(SendMessage, {
|
|
c_func(GetDlgItem, {hdlg, id}), BM_SETCHECK, junk, 0})
|
|
end if
|
|
|
|
elsif iMsg = WM_CLOSE then --closing dialog
|
|
junk = c_func(EndDialog, {hdlg, 0})
|
|
hDlg = 0
|
|
end if
|
|
|
|
return 0
|
|
end function
|
|
|
|
constant IndentDialogCallback = callback("IndentDialogProc")
|
|
|
|
global procedure indent_dialog()
|
|
integer junk
|
|
junk = DialogBoxIndirectParam(c_func(GetModuleHandle, {NULL}), {
|
|
--DLGTEMPLATE{style, exstyle, x, y, cx, cy, menu, wndclass, text}
|
|
{{WS_POPUP, WS_CAPTION, WS_SYSMENU, DS_MODALFRAME}, 0,
|
|
50,50, 100,82, 0, 0, "Indent"},
|
|
--DLGITEMTEMPLATE{style, exstyle, x, y, cx, cy, id, dlgclass, text}
|
|
|
|
{{WS_CHILD, WS_VISIBLE}, 0,
|
|
4,4, 44,12, 1002, DIALOG_CLASS_STATIC, "Indent size"},
|
|
{{WS_CHILD, WS_VISIBLE, WS_BORDER, ES_AUTOHSCROLL, ES_NUMBER}, 0,
|
|
52,4, 44,12, 1003, DIALOG_CLASS_EDIT, ""},
|
|
|
|
{{WS_CHILD, WS_VISIBLE, BS_CHECKBOX}, 0,
|
|
4,20, 92,12, 1005, DIALOG_CLASS_BUTTON, "Show indentation guides"},
|
|
|
|
{{WS_CHILD, WS_VISIBLE, BS_CHECKBOX}, 0,
|
|
4,34, 92,12, 1004, DIALOG_CLASS_BUTTON, "Use tabs in indentation"},
|
|
|
|
{{WS_CHILD, WS_VISIBLE}, 0,
|
|
4,50, 44,12, 1000, DIALOG_CLASS_STATIC, "Tab size"},
|
|
{{WS_CHILD, WS_VISIBLE, WS_BORDER, ES_AUTOHSCROLL, ES_NUMBER}, 0,
|
|
52,50, 44,12, 1001, DIALOG_CLASS_EDIT, ""},
|
|
|
|
{{WS_CHILD, WS_VISIBLE, BS_PUSHBUTTON}, 0,
|
|
4,66, 44,12, IDCANCEL, DIALOG_CLASS_BUTTON, "Cancel"},
|
|
{{WS_CHILD, WS_VISIBLE, BS_DEFPUSHBUTTON}, 0,
|
|
52,66, 44,12, IDOK, DIALOG_CLASS_BUTTON, "OK"}
|
|
},
|
|
hMainWnd,
|
|
IndentDialogCallback,
|
|
0)
|
|
end procedure
|
|
|
|
|
|
|
|
procedure init_fonts()
|
|
atom junk, lf_facesize, lf_size, size, ncm, lf,
|
|
lfCaptionFont, lfSmCaptionFont, lfMenuFont, lfStatusFont, lfMessageFont
|
|
|
|
lf_facesize = 32
|
|
lf_size = 4*5 + 8 + lf_facesize
|
|
size = 4 + 4*5
|
|
lfCaptionFont = size
|
|
size += lf_size + 4*2
|
|
lfSmCaptionFont = size
|
|
size += lf_size + 4*2
|
|
lfMenuFont = size
|
|
size += lf_size
|
|
lfStatusFont = size
|
|
size += lf_size
|
|
lfMessageFont = size
|
|
size += lf_size
|
|
ncm = allocate(size)
|
|
|
|
poke4(ncm, size)
|
|
poke4(ncm+lfCaptionFont, -1)
|
|
poke4(ncm+lfSmCaptionFont, -1)
|
|
poke4(ncm+lfMenuFont, -1)
|
|
poke4(ncm+lfStatusFont, -1)
|
|
poke4(ncm+lfMessageFont, -1)
|
|
|
|
junk = c_func(SystemParametersInfo, {SPI_GETNONCLIENTMETRICS, size, ncm, 0})
|
|
|
|
captionFont = c_func(CreateFontIndirect, {ncm+lfCaptionFont})
|
|
smCaptionFont = c_func(CreateFontIndirect, {ncm+lfSmCaptionFont})
|
|
menuFont = c_func(CreateFontIndirect, {ncm+lfMenuFont})
|
|
statusFont = c_func(CreateFontIndirect, {ncm+lfStatusFont})
|
|
messageFont = c_func(CreateFontIndirect, {ncm+lfMessageFont})
|
|
free(ncm)
|
|
end procedure
|
|
|
|
procedure process_dropfiles(atom hDrop)
|
|
integer count, len, size
|
|
atom buf, junk
|
|
|
|
-- get the number of files dropped
|
|
count = c_func(DragQueryFile, {hDrop, #FFFFFFFF, NULL, 0})
|
|
for i = 0 to count-1 do
|
|
-- get the length of the indexed filename and null-terminator
|
|
size = c_func(DragQueryFile, {hDrop, i, NULL, 0}) + 1
|
|
buf = allocate(size)
|
|
-- get the indexed filename into our buffer and open it
|
|
junk = c_func(DragQueryFile, {hDrop, i, buf, size})
|
|
open_file(peek_string(buf), 0)
|
|
free(buf)
|
|
end for
|
|
c_proc(DragFinish, {hDrop})
|
|
end procedure
|
|
|
|
|
|
integer doing_setfocus_checks
|
|
doing_setfocus_checks = 0
|
|
|
|
global function WndProc(atom hwnd, atom iMsg, atom wParam, atom lParam)
|
|
-- callback routine to handle Window class
|
|
atom junk, hwndFrom, code
|
|
integer rc
|
|
rc = 0
|
|
|
|
if hwnd != hMainWnd then
|
|
--? {hwnd, iMsg, wParam, lParam}
|
|
return c_func(DefWindowProc, {hwnd, iMsg, wParam, lParam})
|
|
end if
|
|
if iMsg = WM_NOTIFY then
|
|
sequence nmhdr = unpack(lParam, "ppi")
|
|
-- lParam is pointer to NMHDR { HWND hwndFrom; UINT_PTR idFrom; UINT code; }
|
|
hwndFrom = nmhdr[1]
|
|
code = nmhdr[3]
|
|
--printf(1, "hwndFrom=%x idFrom=%x code=%x %x %x\n", nmhdr & {LOWORD(code), HIWORD(code)})
|
|
|
|
if hwndFrom = hedit then
|
|
sci_notify(c_func(SendMessage, {hedit, SCI_GETDIRECTPOINTER, 0, 0}), 0, lParam, 0)
|
|
return rc
|
|
|
|
elsif hwndFrom = htabs then
|
|
if code = TCN_SELCHANGE then
|
|
select_tab(1 + c_func(SendMessage, {htabs, TCM_GETCURSEL, 0, 0}))
|
|
elsif code = TCN_SELCHANGING then
|
|
-- unhighlight the current tab
|
|
junk = c_func(SendMessage, {htabs, TCM_HIGHLIGHTITEM,
|
|
c_func(SendMessage, {htabs, TCM_GETCURSEL, 0, 0}), 0})
|
|
elsif code = NM_RCLICK then
|
|
rightclick_tab()
|
|
end if
|
|
elsif hwndFrom = htooltip and code = TTN_NEEDTEXT then
|
|
junk = allocate_pack("zdppddddps", { -- TOOLINFO
|
|
TTF_IDISHWND + TTF_SUBCLASS, -- uFlags
|
|
hMainWnd, -- hwnd
|
|
htabs, -- uId
|
|
0,0,0,0, -- rect
|
|
0, -- hinst
|
|
file_name -- lpszText
|
|
})
|
|
c_func(SendMessage, {htooltip, TTM_UPDATETIPTEXT, 0, junk})
|
|
free(junk)
|
|
end if
|
|
end if
|
|
|
|
if iMsg = WM_CREATE then
|
|
return rc
|
|
elsif iMsg = WM_DESTROY then
|
|
c_proc(PostQuitMessage, {0})
|
|
get_window_size()
|
|
save_wee_conf(wee_conf_filename)
|
|
return rc
|
|
elsif iMsg = WM_SIZE then --resize the rich edit control to fit the window
|
|
c_proc(MoveWindow, {hedit, 0, tab_h, LOWORD(lParam), HIWORD(lParam)-tab_h, 1})
|
|
c_proc(MoveWindow, {hstatus, LOWORD(lParam)-64, 2, 64, tab_h-4, 1})
|
|
c_proc(MoveWindow, {htabs, 0, 0, LOWORD(lParam), tab_h, 1})
|
|
return rc
|
|
elsif iMsg = WM_CLOSE then --closing window
|
|
if save_modified_tabs() then
|
|
junk = c_func(DestroyWindow, {hwnd})
|
|
end if
|
|
return rc
|
|
elsif iMsg = WM_SETFOCUS then --always pass focus on to rich edit control
|
|
if not doing_setfocus_checks then
|
|
doing_setfocus_checks = 1
|
|
check_ex_err()
|
|
check_externally_modified_tabs()
|
|
junk = c_func(SetFocus, {hedit})
|
|
doing_setfocus_checks = 0
|
|
end if
|
|
return rc
|
|
elsif iMsg = WM_COMMAND then
|
|
if lParam = 0 then
|
|
if wParam = File_New then
|
|
new_file()
|
|
return rc
|
|
elsif wParam = File_Open then
|
|
open_file("", 0)
|
|
return rc
|
|
elsif wParam = File_Save then
|
|
save_if_modified(0) -- no confirm
|
|
return rc
|
|
elsif wParam = File_SaveAs then
|
|
junk = save_file_as()
|
|
return rc
|
|
elsif wParam = File_Close then
|
|
close_tab()
|
|
return rc
|
|
elsif wParam = File_Exit then
|
|
return c_func(SendMessage, {hwnd, WM_CLOSE, 0, 0})
|
|
elsif wParam = Edit_Undo then
|
|
return c_func(SendMessage, {hedit, WM_UNDO, 0, 0})
|
|
elsif wParam = Edit_Redo then
|
|
return c_func(SendMessage, {hedit, SCI_REDO, 0, 0})
|
|
elsif wParam = Edit_Cut then
|
|
return c_func(SendMessage, {hedit, WM_CUT, 0, 0})
|
|
elsif wParam = Edit_Copy then
|
|
return c_func(SendMessage, {hedit, WM_COPY, 0, 0})
|
|
elsif wParam = Edit_Paste then
|
|
return c_func(SendMessage, {hedit, WM_PASTE, 0, 0})
|
|
elsif wParam = Edit_Clear then
|
|
return c_func(SendMessage, {hedit, WM_CLEAR, 0, 0})
|
|
elsif wParam = Edit_SelectAll then
|
|
return c_func(SendMessage, {hedit, EM_SETSEL, 0, -1})
|
|
elsif wParam = Edit_ToggleComment then
|
|
toggle_comment()
|
|
return rc
|
|
elsif wParam = Search_Find then
|
|
sequence s = get_selection()
|
|
if length(s) then
|
|
find_phrase = s
|
|
end if
|
|
hFindDlg = FindText(hMainWnd,0,FR_DOWN,find_phrase)
|
|
return rc
|
|
elsif wParam = Search_Find_Next then
|
|
if length(find_phrase) = 0 then
|
|
sequence s = get_selection()
|
|
if length(s) then
|
|
find_phrase = s
|
|
end if
|
|
hFindDlg = FindText(hMainWnd,0,FR_DOWN,find_phrase)
|
|
else
|
|
search_find(find_phrase, 0)
|
|
end if
|
|
return rc
|
|
elsif wParam = Search_Find_Prev then
|
|
search_find(find_phrase, 1)
|
|
return rc
|
|
elsif wParam = Search_Replace then
|
|
sequence s = get_selection()
|
|
if length(s) then
|
|
find_phrase = s
|
|
end if
|
|
hFindDlg = ReplaceText(hMainWnd,0,FR_DOWN,find_phrase,replace_phrase)
|
|
return rc
|
|
elsif wParam = View_Subs then
|
|
view_subroutines()
|
|
return rc
|
|
elsif wParam = View_Error then
|
|
ui_view_error()
|
|
return rc
|
|
elsif wParam = View_Completions then
|
|
view_completions()
|
|
return rc
|
|
elsif wParam = View_Declaration then
|
|
view_declaration()
|
|
return rc
|
|
elsif wParam = View_SubArgs then
|
|
view_subroutine_arguments()
|
|
return rc
|
|
elsif wParam = View_GoBack then
|
|
go_back()
|
|
return rc
|
|
elsif wParam = Run_Start then
|
|
run_start(0)
|
|
return rc
|
|
elsif wParam = Run_WithArgs then
|
|
run_start(1)
|
|
return rc
|
|
elsif wParam = Run_Arguments then
|
|
run_arguments()
|
|
return rc
|
|
elsif wParam = Run_Interpreter then
|
|
run_interpreter()
|
|
elsif wParam = Run_Bind then
|
|
run_convert("Bind", "eubind")
|
|
return rc
|
|
elsif wParam = Run_Shroud then
|
|
run_convert("Shroud", "eushroud")
|
|
return rc
|
|
elsif wParam = Run_Translate then
|
|
run_convert("Translate", "euc")
|
|
return rc
|
|
elsif wParam = Options_Font then
|
|
sequence s = ChooseFont(hMainWnd, font_name, font_height)
|
|
if length(s) then
|
|
font_name = s[1]
|
|
font_height = s[2]
|
|
reinit_all_edits()
|
|
end if
|
|
return rc
|
|
elsif wParam = Options_LineNumbers then
|
|
line_numbers = not line_numbers
|
|
reinit_all_edits()
|
|
return c_func(CheckMenuItem, {hoptionsmenu, Options_LineNumbers, MF_CHECKED*line_numbers})
|
|
elsif wParam = Options_SortedSubs then
|
|
sorted_subs = not sorted_subs
|
|
return c_func(CheckMenuItem, {hoptionsmenu, Options_SortedSubs, MF_CHECKED*sorted_subs})
|
|
elsif wParam = Options_Colors then
|
|
choose_colors()
|
|
return rc
|
|
elsif wParam = Options_LineWrap then
|
|
line_wrap = not line_wrap
|
|
reinit_all_edits()
|
|
return c_func(CheckMenuItem, {hoptionsmenu, Options_LineWrap, MF_CHECKED*line_wrap})
|
|
elsif wParam = Options_ReopenTabs then
|
|
reopen_tabs = not reopen_tabs
|
|
return c_func(CheckMenuItem, {hoptionsmenu, Options_ReopenTabs, MF_CHECKED*reopen_tabs})
|
|
elsif wParam = Options_CompleteStatements then
|
|
complete_statements = not complete_statements
|
|
return c_func(CheckMenuItem, {hoptionsmenu, Options_CompleteStatements, MF_CHECKED*complete_statements})
|
|
elsif wParam = Options_CompleteBraces then
|
|
complete_braces = not complete_braces
|
|
return c_func(CheckMenuItem, {hoptionsmenu, Options_CompleteBraces, MF_CHECKED*complete_braces})
|
|
elsif wParam = Options_ErrorIndicators then
|
|
auto_indicator = not auto_indicator
|
|
return c_func(CheckMenuItem, {hoptionsmenu, Options_ErrorIndicators, MF_CHECKED*auto_indicator})
|
|
elsif wParam = Options_Indent then
|
|
indent_dialog()
|
|
return rc
|
|
elsif wParam = Help_About then
|
|
about_box()
|
|
return rc
|
|
elsif wParam = Help_Tutorial then
|
|
open_tutorial()
|
|
return rc
|
|
elsif wParam = Help_ReleaseNotes then
|
|
release_notes()
|
|
return rc
|
|
elsif wParam = Help_Context then
|
|
context_help()
|
|
return rc
|
|
elsif wParam > File_Recent and wParam <= File_Recent + max_recent_files then
|
|
open_recent(wParam - File_Recent)
|
|
elsif wParam >= Select_Tab and wParam <= Select_Tab + 9 then
|
|
select_tab(wParam - Select_Tab + 1)
|
|
elsif wParam = Select_Prev_Tab then
|
|
select_tab(get_prev_tab())
|
|
elsif wParam = Select_Next_Tab then
|
|
select_tab(get_next_tab())
|
|
else
|
|
printf(1, "%d %d\n", {wParam, lParam})
|
|
end if
|
|
else
|
|
--printf(1, "HIWORD:%d LOWORD:%d LPARAM:%d\n", {HIWORD(wParam), LOWORD(wParam), lParam})
|
|
end if
|
|
elsif iMsg = WM_FIND then -- find/replace dialog
|
|
process_find(lParam)
|
|
elsif iMsg = WM_DROPFILES then
|
|
process_dropfiles(wParam)
|
|
else
|
|
--printf(1, "hwnd=%x iMsg=%d #%x wParam=%d lParam=%d\n", {hwnd, iMsg, iMsg, wParam, lParam})
|
|
|
|
end if
|
|
|
|
return c_func(DefWindowProc, {hwnd, iMsg, wParam, lParam})
|
|
end function
|
|
|
|
-- The scintilla edit control doesn't offer a way to hook accelerator keys
|
|
-- so we have to process messages in our message loop, and intercept and
|
|
-- rewrite them into WM_COMMAND messages for the main window handle.
|
|
procedure translate_editor_keys(atom msg)
|
|
atom hwnd, iMsg, wParam, lParam
|
|
sequence m
|
|
integer ctrl, shift
|
|
|
|
m = unpack(msg, "pdpp")
|
|
|
|
hwnd = m[1]
|
|
iMsg = m[2]
|
|
wParam = m[3]
|
|
lParam = m[4]
|
|
|
|
if hwnd != hedit then
|
|
if hwnd = htabs and iMsg = WM_MBUTTONDOWN then
|
|
atom point
|
|
integer tab
|
|
point = allocate(12)
|
|
poke4(point, {LOWORD(lParam), HIWORD(lParam), 0})
|
|
tab = c_func(SendMessage, {htabs, TCM_HITTEST, 0, point})
|
|
free(point)
|
|
if tab >= 0 then
|
|
-- middle click to close tab
|
|
select_tab(tab + 1)
|
|
m = {hMainWnd, WM_COMMAND, File_Close, 0}
|
|
pack(msg, "pdpp", m)
|
|
end if
|
|
elsif hwnd = htabs and iMsg = WM_MOUSEWHEEL then
|
|
-- select prev/next tabs when scrolled by mouse wheel
|
|
if HIWORD(wParam) < #8000 then
|
|
m = {hMainWnd, WM_COMMAND, Select_Prev_Tab, 0}
|
|
else
|
|
m = {hMainWnd, WM_COMMAND, Select_Next_Tab, 0}
|
|
end if
|
|
pack(msg, "pdpp", m)
|
|
end if
|
|
return
|
|
end if
|
|
|
|
if iMsg = WM_CHAR then
|
|
shift = and_bits(c_func(GetKeyState, {VK_SHIFT}), #8000)
|
|
ctrl = and_bits(c_func(GetKeyState, {VK_CONTROL}), #8000)
|
|
--printf(1, "%x %x %x %x\n", {hwnd, iMsg, wParam, lParam})
|
|
if wParam = 27 then -- Esc
|
|
m = {hMainWnd, WM_COMMAND, View_GoBack, 0}
|
|
elsif not ctrl then
|
|
-- control key is not pressed
|
|
elsif wParam = #13 then -- Ctrl+S
|
|
m = {hMainWnd, WM_COMMAND, File_Save, 0}
|
|
elsif wParam = #6 then -- Ctrl+F
|
|
m = {hMainWnd, WM_COMMAND, Search_Find, 0}
|
|
elsif wParam = #12 then -- Ctrl+R
|
|
m = {hMainWnd, WM_COMMAND, Search_Replace, 0}
|
|
elsif wParam = #7 then -- Ctrl+G
|
|
if shift then
|
|
m = {hMainWnd, WM_COMMAND, Search_Find_Prev, 0}
|
|
else
|
|
m = {hMainWnd, WM_COMMAND, Search_Find_Next, 0}
|
|
end if
|
|
elsif wParam = #17 then -- Ctrl+W
|
|
m = {hMainWnd, WM_COMMAND, File_Close, 0}
|
|
elsif wParam = #D then -- Ctrl+M
|
|
m = {hMainWnd, WM_COMMAND, Edit_ToggleComment, 0}
|
|
elsif wParam = #E then -- Ctrl+N
|
|
m = {hMainWnd, WM_COMMAND, File_New, 0}
|
|
elsif wParam = #F then -- Ctrl+O
|
|
m = {hMainWnd, WM_COMMAND, File_Open, 0}
|
|
elsif wParam = #11 then -- Ctrl+Q
|
|
m = {hMainWnd, WM_COMMAND, File_Exit, 0}
|
|
elsif wParam = VK_SPACE then
|
|
m = {hMainWnd, WM_COMMAND, View_Completions, 0}
|
|
elsif wParam = 26 and shift then
|
|
m = {hMainWnd, WM_COMMAND, Edit_Redo, 0}
|
|
elsif wParam = 25 then -- Ctrl+Y
|
|
m = {hMainWnd, WM_COMMAND, Edit_Redo, 0}
|
|
else
|
|
return
|
|
end if
|
|
elsif iMsg = WM_KEYUP then
|
|
shift = and_bits(c_func(GetKeyState, {VK_SHIFT}), #8000)
|
|
ctrl = and_bits(c_func(GetKeyState, {VK_CONTROL}), #8000)
|
|
if wParam = VK_F5 and shift then
|
|
m = {hMainWnd, WM_COMMAND, Run_WithArgs, 0}
|
|
elsif wParam = VK_F5 then
|
|
m = {hMainWnd, WM_COMMAND, Run_Start, 0}
|
|
elsif wParam = VK_F4 and ctrl then
|
|
m = {hMainWnd, WM_COMMAND, File_Close, 0}
|
|
elsif wParam = VK_F4 then
|
|
m = {hMainWnd, WM_COMMAND, View_Error, 0}
|
|
elsif wParam = VK_F3 then
|
|
if shift then
|
|
m = {hMainWnd, WM_COMMAND, Search_Find_Prev, 0}
|
|
elsif ctrl then
|
|
m = {hMainWnd, WM_COMMAND, Search_Find, 0}
|
|
else
|
|
m = {hMainWnd, WM_COMMAND, Search_Find_Next, 0}
|
|
end if
|
|
elsif wParam = VK_F2 and ctrl then
|
|
m = {hMainWnd, WM_COMMAND, View_Declaration, 0}
|
|
elsif wParam = VK_F2 and shift then
|
|
m = {hMainWnd, WM_COMMAND, View_SubArgs, 0}
|
|
elsif wParam = VK_F2 then
|
|
m = {hMainWnd, WM_COMMAND, View_Subs, 0}
|
|
elsif wParam = #5A and ctrl and shift then
|
|
m = {hMainWnd, WM_COMMAND, Edit_Redo, 0}
|
|
elsif (wParam = VK_PRIOR or (wParam = VK_TAB and shift)) and ctrl then
|
|
m = {hMainWnd, WM_COMMAND, Select_Prev_Tab, 0}
|
|
elsif (wParam = VK_NEXT or wParam = VK_TAB) and ctrl then
|
|
m = {hMainWnd, WM_COMMAND, Select_Next_Tab, 0}
|
|
elsif wParam = VK_F1 then
|
|
m = {hMainWnd, WM_COMMAND, Help_Context, 0}
|
|
else
|
|
return
|
|
end if
|
|
elsif iMsg = WM_SYSCHAR then
|
|
if wParam >= '1' and wParam <= '9' then
|
|
m = {hMainWnd, WM_COMMAND, wParam - '1' + Select_Tab, 0}
|
|
else
|
|
return
|
|
end if
|
|
else
|
|
return
|
|
end if
|
|
--printf(1, "%x %x %x %x\n", m)
|
|
pack(msg, "pdpp", m)
|
|
end procedure
|
|
|
|
|
|
constant AppName = "WeeEditor"
|
|
|
|
|
|
global procedure ui_main()
|
|
-- main routine
|
|
atom msg
|
|
integer id
|
|
atom junk, tcitem
|
|
|
|
init_fonts()
|
|
|
|
msg = allocate(SIZE_OF_MESSAGE)
|
|
|
|
id = routine_id("WndProc")
|
|
if id = -1 then
|
|
puts(1, "routine_id failed!\n")
|
|
abort(1)
|
|
end if
|
|
class = RegisterClass({
|
|
or_bits(CS_HREDRAW, CS_VREDRAW),
|
|
call_back(id), -- get 32-bit address for callback
|
|
0,
|
|
0,
|
|
0,
|
|
c_func(LoadIcon, {NULL, IDI_APPLICATION}),
|
|
c_func(LoadCursor, {NULL, IDC_ARROW}),
|
|
c_func(GetStockObject, {WHITE_BRUSH}),
|
|
NULL,
|
|
AppName,
|
|
c_func(LoadIcon, {NULL, IDI_APPLICATION})})
|
|
if class = 0 then
|
|
puts(1, "Couldn't register class\n")
|
|
abort(1)
|
|
end if
|
|
|
|
-- this is required for FindText,ReplaceText common dialogs to work
|
|
WM_FIND = c_func(RegisterWindowMessage,{alloc_string(FINDMSGSTRING)})
|
|
|
|
-- menu creation
|
|
-- file menu
|
|
hfilemenu = c_func(CreateMenu, {})
|
|
junk = c_func(AppendMenu, {hfilemenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
File_New, alloc_string("&New\tCtrl+N")})
|
|
junk = c_func(AppendMenu, {hfilemenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
File_Open, alloc_string("&Open...\tCtrl+O")})
|
|
junk = c_func(AppendMenu, {hfilemenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
File_Save, alloc_string("&Save\tCtrl+S")})
|
|
junk = c_func(AppendMenu, {hfilemenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
File_SaveAs, alloc_string("Save &As...")})
|
|
junk = c_func(AppendMenu, {hfilemenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
File_Close, alloc_string("&Close\tCtrl+W")})
|
|
-- junk = c_func(AppendMenu, {hfilemenu, MF_BYPOSITION + MF_SEPARATOR, 0, 0})
|
|
-- junk = c_func(AppendMenu, {hfilemenu, MF_BYPOSITION + MF_STRING + MF_GRAYED,
|
|
-- File_Print, alloc_string("Print...")})
|
|
-- junk = c_func(AppendMenu, {hfilemenu, MF_BYPOSITION + MF_STRING + MF_GRAYED,
|
|
-- File_PageSetup, alloc_string("Page Setup...")})
|
|
junk = c_func(AppendMenu, {hfilemenu, MF_BYPOSITION + MF_SEPARATOR, 0, 0})
|
|
junk = c_func(AppendMenu, {hfilemenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
File_Exit, alloc_string("E&xit\tAlt+F4")})
|
|
-- edit menu
|
|
heditmenu = c_func(CreateMenu, {})
|
|
junk = c_func(AppendMenu, {heditmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Edit_Undo, alloc_string("U&ndo\tCtrl+Z")})
|
|
junk = c_func(AppendMenu, {heditmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Edit_Redo, alloc_string("&Redo\tShift+Ctrl+Z")})
|
|
junk = c_func(AppendMenu, {heditmenu, MF_BYPOSITION + MF_SEPARATOR, 0, 0})
|
|
junk = c_func(AppendMenu, {heditmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Edit_Cut, alloc_string("Cu&t\tCtrl+X")})
|
|
junk = c_func(AppendMenu, {heditmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Edit_Copy, alloc_string("&Copy\tCtrl+C")})
|
|
junk = c_func(AppendMenu, {heditmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Edit_Paste, alloc_string("&Paste\tCtrl+V")})
|
|
junk = c_func(AppendMenu, {heditmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Edit_Clear, alloc_string("Cl&ear\tDel")})
|
|
junk = c_func(AppendMenu, {heditmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Edit_SelectAll, alloc_string("Select &All\tCtrl+A")})
|
|
junk = c_func(AppendMenu, {heditmenu, MF_BYPOSITION + MF_SEPARATOR, 0, 0})
|
|
junk = c_func(AppendMenu, {heditmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Edit_ToggleComment, alloc_string("Toggle Co&mment\tCtrl+M")})
|
|
-- search menu
|
|
hsearchmenu = c_func(CreateMenu, {})
|
|
junk = c_func(AppendMenu, {hsearchmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Search_Find, alloc_string("&Find...\tCtrl+F3")})
|
|
junk = c_func(AppendMenu, {hsearchmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Search_Find_Next, alloc_string("Find &Next\tF3")})
|
|
junk = c_func(AppendMenu, {hsearchmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Search_Find_Prev, alloc_string("Find &Previous\tShift+F3")})
|
|
junk = c_func(AppendMenu, {hsearchmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Search_Replace, alloc_string("&Replace...")})
|
|
-- view menu
|
|
hviewmenu = c_func(CreateMenu, {})
|
|
junk = c_func(AppendMenu, {hviewmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
View_Subs, alloc_string("&Subroutines...\tF2")})
|
|
junk = c_func(AppendMenu, {hviewmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
View_Declaration, alloc_string("&Declaration\tCtrl+F2")})
|
|
junk = c_func(AppendMenu, {hviewmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
View_SubArgs, alloc_string("Subroutine &Arguments...\tShift+F2")})
|
|
junk = c_func(AppendMenu, {hviewmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
View_Completions, alloc_string("&Completions...\tCtrl+Space")})
|
|
junk = c_func(AppendMenu, {hviewmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
View_Error, alloc_string("Goto &Error\tF4")})
|
|
junk = c_func(AppendMenu, {hviewmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
View_GoBack, alloc_string("Go &Back\tEsc")})
|
|
-- run menu
|
|
hrunmenu = c_func(CreateMenu, {})
|
|
junk = c_func(AppendMenu, {hrunmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Run_Start, alloc_string("&Start\tF5")})
|
|
junk = c_func(AppendMenu, {hrunmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Run_WithArgs, alloc_string("Start with &Arguments\tShift-F5")})
|
|
junk = c_func(AppendMenu, {hrunmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Run_Arguments, alloc_string("Set Arguments...")})
|
|
junk = c_func(AppendMenu, {hrunmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Run_Interpreter, alloc_string("Set Interpreter...")})
|
|
junk = c_func(AppendMenu, {hrunmenu, MF_BYPOSITION + MF_SEPARATOR, 0, 0})
|
|
junk = c_func(AppendMenu, {hrunmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Run_Bind, alloc_string("&Bind")})
|
|
junk = c_func(AppendMenu, {hrunmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Run_Shroud, alloc_string("S&hroud")})
|
|
junk = c_func(AppendMenu, {hrunmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Run_Translate, alloc_string("&Translate and Compile")})
|
|
-- options menu
|
|
hoptionsmenu = c_func(CreateMenu, {})
|
|
junk = c_func(AppendMenu, {hoptionsmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Options_Font, alloc_string("&Font...")})
|
|
junk = c_func(AppendMenu, {hoptionsmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Options_LineNumbers, alloc_string("&Line Numbers")})
|
|
junk = c_func(AppendMenu, {hoptionsmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Options_SortedSubs, alloc_string("&Sort View Subroutines")})
|
|
junk = c_func(AppendMenu, {hoptionsmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Options_Colors, alloc_string("&Colors...")})
|
|
junk = c_func(AppendMenu, {hoptionsmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Options_LineWrap, alloc_string("Line &Wrap")})
|
|
junk = c_func(AppendMenu, {hoptionsmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Options_ReopenTabs, alloc_string("&Reopen Tabs Next Time")})
|
|
junk = c_func(AppendMenu, {hoptionsmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Options_CompleteStatements, alloc_string("Complete Statements")})
|
|
junk = c_func(AppendMenu, {hoptionsmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Options_CompleteBraces, alloc_string("Complete Braces")})
|
|
junk = c_func(AppendMenu, {hoptionsmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Options_Indent, alloc_string("&Indents...")})
|
|
junk = c_func(AppendMenu, {hoptionsmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Options_ErrorIndicators, alloc_string("Error Indicators")})
|
|
-- help menu
|
|
hhelpmenu = c_func(CreateMenu, {})
|
|
junk = c_func(AppendMenu, {hhelpmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Help_About, alloc_string("&About...")})
|
|
junk = c_func(AppendMenu, {hhelpmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Help_ReleaseNotes, alloc_string("&Release Notes...")})
|
|
junk = c_func(AppendMenu, {hhelpmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Help_Tutorial, alloc_string("&Tutorial")})
|
|
junk = c_func(AppendMenu, {hhelpmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
Help_Context, alloc_string("&Help\tF1")})
|
|
-- main menu
|
|
hmenu = c_func(CreateMenu, {})
|
|
junk = c_func(AppendMenu, {hmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED + MF_POPUP,
|
|
hfilemenu, alloc_string("&File")})
|
|
junk = c_func(AppendMenu, {hmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED + MF_POPUP,
|
|
heditmenu, alloc_string("&Edit")})
|
|
junk = c_func(AppendMenu, {hmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED + MF_POPUP,
|
|
hsearchmenu, alloc_string("&Search")})
|
|
junk = c_func(AppendMenu, {hmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED + MF_POPUP,
|
|
hviewmenu, alloc_string("&View")})
|
|
junk = c_func(AppendMenu, {hmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED + MF_POPUP,
|
|
hrunmenu, alloc_string("&Run")})
|
|
junk = c_func(AppendMenu, {hmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED + MF_POPUP,
|
|
hoptionsmenu, alloc_string("&Options")})
|
|
junk = c_func(AppendMenu, {hmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED + MF_POPUP,
|
|
hhelpmenu, alloc_string("&Help")})
|
|
|
|
-- tab popup menu
|
|
htabmenu = c_func(CreatePopupMenu)
|
|
junk = c_func(AppendMenu, {htabmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
File_Save, alloc_string("Save")})
|
|
junk = c_func(AppendMenu, {htabmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
File_SaveAs, alloc_string("Save As")})
|
|
junk = c_func(AppendMenu, {htabmenu, MF_BYPOSITION + MF_STRING + MF_ENABLED,
|
|
File_Close, alloc_string("Close")})
|
|
|
|
free_strings() -- garbage collect menu strings
|
|
|
|
load_wee_conf(wee_conf_filename)
|
|
|
|
-- set the recent items on the file menu
|
|
ui_refresh_file_menu(recent_files)
|
|
|
|
-- set the checkmark on the Line Numbers menu item
|
|
c_func(CheckMenuItem, {hoptionsmenu, Options_LineNumbers, MF_CHECKED*line_numbers})
|
|
c_func(CheckMenuItem, {hoptionsmenu, Options_SortedSubs, MF_CHECKED*sorted_subs})
|
|
c_func(CheckMenuItem, {hoptionsmenu, Options_LineWrap, MF_CHECKED*line_wrap})
|
|
c_func(CheckMenuItem, {hoptionsmenu, Options_ReopenTabs, MF_CHECKED*reopen_tabs})
|
|
c_func(CheckMenuItem, {hoptionsmenu, Options_CompleteStatements, MF_CHECKED*complete_statements})
|
|
c_func(CheckMenuItem, {hoptionsmenu, Options_CompleteBraces, MF_CHECKED*complete_braces})
|
|
c_func(CheckMenuItem, {hoptionsmenu, Options_ErrorIndicators, MF_CHECKED*auto_indicator})
|
|
|
|
-- window creation
|
|
hMainWnd = CreateWindow({
|
|
0, -- extended style
|
|
AppName, -- window class name
|
|
"", -- window caption
|
|
WS_OVERLAPPEDWINDOW, -- window style
|
|
x_pos, -- initial x position
|
|
y_pos, -- initial y position
|
|
x_size, -- initial x size
|
|
y_size, -- initial y size
|
|
NULL, -- parent window handle
|
|
hmenu, -- window menu handle
|
|
0 , --hInstance // program instance handle
|
|
NULL}) -- creation parameters
|
|
|
|
junk = c_func(LoadLibrary, {alloc_string("RICHED32.DLL")}) --needed for richedit
|
|
|
|
hstatus = CreateWindow({0, "STATIC", "static",
|
|
{WS_CHILD,WS_VISIBLE,SS_RIGHT},
|
|
0,0,0,0, -- set by resize
|
|
hMainWnd,
|
|
NULL,
|
|
0,
|
|
NULL})
|
|
junk = c_func(SendMessage, {hstatus, WM_SETFONT, statusFont, 0})
|
|
|
|
htabs = CreateWindow({0,"SysTabControl32", "tabs",
|
|
{WS_CHILD,WS_VISIBLE,TCS_FOCUSNEVER},
|
|
0,0,200,20, -- set by resize
|
|
hMainWnd,
|
|
NULL,
|
|
0,
|
|
NULL})
|
|
junk = c_func(SendMessage, {htabs, WM_SETFONT, statusFont, 0})
|
|
|
|
htooltip = CreateWindow({0, "tooltips_class32", 0,
|
|
{WS_POPUP,TTS_ALWAYSTIP},
|
|
CW_USEDEFAULT, CW_USEDEFAULT,
|
|
CW_USEDEFAULT, CW_USEDEFAULT,
|
|
hMainWnd, NULL,
|
|
0, NULL})
|
|
|
|
--printf(1, "hMainWnd=%x hstatus=%x htabs=%x\n", {hMainWnd, hstatus, htabs})
|
|
if hMainWnd = 0 or hstatus = 0 or htabs = 0 or htooltip = 0 then
|
|
puts(1, "Couldn't CreateWindow\n")
|
|
abort(1)
|
|
end if
|
|
|
|
c_func(SendMessage, {hMainWnd, WM_SETICON, ICON_BIG, wee_icon})
|
|
c_func(SendMessage, {hMainWnd, WM_SETICON, ICON_SMALL, wee_icon})
|
|
|
|
-- attach tooltip to tab control
|
|
junk = allocate_pack("zdppddddps", { -- TOOLINFO
|
|
TTF_IDISHWND + TTF_SUBCLASS, -- uFlags
|
|
hMainWnd, -- hwnd
|
|
htabs, -- uId
|
|
0,0,0,0, -- rect
|
|
0, -- hinst
|
|
LPSTR_TEXTCALLBACK -- lpszText
|
|
})
|
|
c_func(SendMessage, {htooltip, TTM_ADDTOOL, 0, junk})
|
|
free(junk)
|
|
|
|
-- open files from last time and on command line
|
|
open_tabs()
|
|
|
|
--if SetThemeAppProperties != -1 then
|
|
-- c_proc(SetThemeAppProperties, {STAP_ALLOW_NONCLIENT+STAP_ALLOW_CONTROLS})
|
|
-- junk = c_func(SendMessage, {hMainWnd, WM_THEMECHANGED, 0, 0})
|
|
--end if
|
|
|
|
c_proc(ShowWindow, {hMainWnd, SW_SHOWNORMAL})
|
|
c_proc(UpdateWindow, {hMainWnd})
|
|
c_proc(DragAcceptFiles, {hMainWnd, 1})
|
|
|
|
while c_func(GetMessage, {msg, NULL, 0, 0}) do
|
|
if hFindDlg and c_func(IsDialogMessage,{hFindDlg,msg}) then
|
|
-- this message is handled by find dialog (thanks Jacques)
|
|
-- it makes the tab key work for find/replace dialogs
|
|
elsif hDlg and c_func(IsDialogMessage,{hDlg,msg}) then
|
|
-- ditto
|
|
? hDlg
|
|
else
|
|
translate_editor_keys(msg)
|
|
junk = c_func(TranslateMessage, {msg})
|
|
junk = c_func(DispatchMessage, {msg})
|
|
end if
|
|
end while
|
|
|
|
end procedure
|
|
|
|
wee_init()
|
|
ui_main()
|