-
Notifications
You must be signed in to change notification settings - Fork 0
/
pmlrun.pmlfrm
197 lines (185 loc) · 6.41 KB
/
pmlrun.pmlfrm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
-- Copyright (c) 2022 K.Awata
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy
-- of this software and associated documentation files (the "Software"), to deal
-- in the Software without restriction, including without limitation the rights
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-- copies of the Software, and to permit persons to whom the Software is
-- furnished to do so, subject to the following conditions:
--
-- The above copyright notice and this permission notice shall be included in all
-- copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-- SOFTWARE.
-- Form !!pmlrun provides one click shortcuts to run PML macro files.
setup form !!pmlrun varchars dialog dock right
member .undo is UNDOABLE
member .menuIsOpen is BOOLEAN
member .dirs is ARRAY
member .editor is STRING
member .runext is STRING
text .txtArgs tagwid 4 'Args' anchor t+l+r width 27 is STRING
toggle .tglDots tagwid 3 'All' anchor t+r callback '!this.refreshList()'
list .lstFiles anchor all at xmin.txtArgs ymax call '!this.onClickList(' width 36 length 16
track 'DBCHANGED' 'DESICE' 'CATACE' 'PROPCE' 'ISODCE' 'PADDCE' 'DICTCE' call '!this.track('
exit
-- Constructor sets default values for the members.
define method .pmlrun()
!this.formtitle = 'PML Runner'
!this.callback = '!this.Init()'
!menu = !this.NewMenu('menu')
!menu.callback = '!this.beforePopupMenu()'
!menu.Add('CALLBACK', 'Open...', '!this.OpenFile(!this.lstFiles.Selection())')
!menu.Add('CALLBACK', 'Run', '!this.RunFile(!this.lstFiles.Selection())')
!menu.Add('CALLBACK', 'Copy as $$M', '!this.CopyAsCommand(!this.lstFiles.Selection())')
!menu.Add('SEPARATOR')
!menu.Add('CALLBACK', 'Refresh', '!this.Init()')
!this.lstFiles.SetPopup(!menu)
endmethod
-- Init initializes this form.
define method .Init()
!this.undo = object UNDOABLE()
!this.menuIsOpen = false
!this.editor = 'start ""'
!this.runext = '.mac'
var !evar evar 'pmlrun'
if !evar eq '' then
!evar = '%userprofile%\.pmlrun'
endif
!this.loadEvar(!evar)
!this.refreshList()
endmethod
-- loadEvar sets directories to store macro files from a STRING separated by semicolon.
define method .loadEvar(!evar is STRING)
!this.dirs.Clear()
do !dirname values !evar.Split(';')
skip if !dirname.Trim() eq ''
!dir = object FILE(!dirname.Trim())
syscom |if not exist "$!dir" mkdir "$!dir"|
skip if !dir.Type() ne 'DIRECTORY'
handle any
skip
endhandle
!this.dirs.Append(object FILE(!dir.PathName() + '\' + !dir.Entry()))
enddo
endmethod
-- refreshList refreshes the list control.
define method .refreshList()
!this.lstFiles.Clear()
do !dir values !this.dirs
!this.lstFiles.Add('[' + !dir.Name() + ']', !dir.Name())
!this.populateDir(!dir, 2)
!init = object FILE(!dir.Name() + '\.init')
if !init.Exists() then
$M"$!init"
endif
enddo
endmethod
-- populateDir populates macro files list from the specified directory.
define method .populateDir(!dir is FILE, !indent is REAL)
do !f values !dir.SubDirs()
!name = !f.Entry()
skip if not !this.tglDots.val and !name.Substring(1, 1) eq '.'
var !dtext compose space $!indent |$!name/|
skip if !dtext.Empty()
!this.lstFiles.Add(!dtext[1], !f.Name())
!this.populateDir(!f, !indent + 4)
enddo
do !f values !dir.Files()
!name = !f.Entry()
skip if not !this.tglDots.val and !name.Substring(1, 1) eq '.'
if !name.MatchWild('*' + !this.runext) then
!name = !name.Replace(!this.runext, '', -1, 1)
endif
var !dtext compose space $!indent |- $!name|
skip if !dtext.Empty()
!this.lstFiles.Add(!dtext[1], !f.Name())
enddo
endmethod
-- track runs macro that is the same as event name with prefix "." dot.
define method .track(!form is FORM, !event is STRING)
do !dir values !this.dirs
!file = object FILE(!dir.Name() + '\.' + !event)
if !file.Exists() then
$M"$!file"
endif
enddo
endmethod
-- beforePopupMenu is a callback method before opening right click menu.
define method .beforePopupMenu()
!this.menuIsOpen = true
endmethod
-- onClickList is a callback method on click a row in the list control.
define method .onClickList(!gadget is GADGET, !select is STRING)
if !select ne 'SELECT' then
return
endif
if !this.menuIsOpen then
!this.menuIsOpen = false
return
endif
!f = object FILE(|$!gadget|)
if not !f.Exists() then
!this.Init()
return
endif
if !f.Type() eq 'FILE' then
if !f.Entry().MatchWild('*' + !this.runext) then
!this.undo.Add()
$M"$!f" $!this.txtArgs.val
!this.undo.EndUndoable()
else
syscom |$!this.editor "$!f"|
endif
endif
endmethod
-- RunFile runs the specified file.
define method .RunFile(!file is STRING)
!f = object FILE(!file)
if Unset(!f) then
return
endif
if not !f.Exists() then
!this.Init()
return
endif
if !f.Type() ne 'FILE' then
return
endif
!this.undo.Add()
$M"$!f" $!this.txtArgs.val
!this.undo.Endundoable()
endmethod
-- OpenFile opens the specified file.
define method .OpenFile(!file is STRING)
!f = object FILE(!file)
if Unset(!f) then
return
endif
if not !f.Exists() then
!this.Init()
return
endif
syscom |$!this.editor "$!f"|
endmethod
-- CopyAsCommand copies the specified file as $M command to the clipboard.
define method .CopyAsCommand(!file is STRING)
!f = object FILE(!file)
if Unset(!f) then
return
endif
if not !f.Exists() then
!this.Init()
return
endif
if !f.Type() ne 'FILE' then
return
endif
syscom |echo $$M"$!f"|| clip|
endmethod