Thanks @Leo for offering help. I tried to condense the script (SelectByDate) as much as possible while maintaining the call structure and created a button to test the behaviour. I hope this is fine
Methods get called like this
-
OnClick
(originally command entry point), progress is created from func.command.progress -
ShowSelectionDetailsDialog
hands progress object over to ... -
QueryFileDates
progress is initialized, shown and used. Afer enumerationprogress.Hide()
gets called but progress still is shown -
ShowSelectionDetailsDialog
tries to hide progress again, returns to ... -
OnClick
where progress gets restarted and handed over to ... -
SelectFiles
where it is shown again
When Onclick returns, the progress is finally gone.
progress.Hide()
gets called in lines
- 140
- 32
- 172
<?xml version="1.0"?>
<button backcol="none" display="both" label_pos="right" textcol="none">
<label>SelectByDateSample</label>
<icon1>#newcommand</icon1>
<function type="script">
<instruction>@script JScript</instruction>
<instruction>function OnClick(clickData)</instruction>
<instruction>{</instruction>
<instruction> var cmd = clickData.func.command;</instruction>
<instruction> var progress = clickData.func.command.progress;</instruction>
<instruction> progress.abort = progress.pause = true;</instruction>
<instruction> </instruction>
<instruction> var dateSelectorFunction = function(item){return item.create;};</instruction>
<instruction> var result = ShowSelectionDetailsDialog(clickData.func.sourcetab, dateSelectorFunction, "create", progress, "all", false, "bydate");</instruction>
<instruction />
<instruction> if(!result)</instruction>
<instruction> return;</instruction>
<instruction />
<instruction> progress.abort = progress.pause = false;</instruction>
<instruction> progress.Restart();</instruction>
<instruction> </instruction>
<instruction> var filesToSelect = SelectFiles(clickData.func.sourcetab, result.selectorFunction, result.cachedDates, result.fileCount, progress);</instruction>
<instruction> if(filesToSelect)</instruction>
<instruction> {</instruction>
<instruction> cmd.SetFiles(filesToSelect);</instruction>
<instruction> cmd.RunCommand("Select FROMSCRIPT EXACT MAKEVISIBLE SETFOCUS");</instruction>
<instruction> }</instruction>
<instruction>}</instruction>
<instruction />
<instruction>function ShowSelectionDetailsDialog(tab, dateSelectorFunction, dateSource, progress, itemType, selectOnlyFromSelectedItems, defaultSelector)</instruction>
<instruction>{</instruction>
<instruction> var fileQueryResult = QueryFileDates(tab, dateSelectorFunction, dateSource, progress, itemType, selectOnlyFromSelectedItems);</instruction>
<instruction> if(!fileQueryResult)</instruction>
<instruction> return null; </instruction>
<instruction />
<instruction> ///////////////////////////////////////////////////</instruction>
<instruction> ///////////////////////////////////////////////////</instruction>
<instruction> progress.Hide(); // 2nd call HERE IT SHOULD BE GONE</instruction>
<instruction> ///////////////////////////////////////////////////</instruction>
<instruction> ///////////////////////////////////////////////////</instruction>
<instruction> </instruction>
<instruction> var dlg = DOpus.Dlg;</instruction>
<instruction> dlg.window = tab;</instruction>
<instruction> </instruction>
<instruction> if(fileQueryResult.validFileCount == 0)</instruction>
<instruction> {</instruction>
<instruction> dlg.message = "No files found in \"" + tab.path + "\" with '" + dateSource + "' property.";</instruction>
<instruction> dlg.buttons = "OK";</instruction>
<instruction> dlg.title = "No files found";</instruction>
<instruction> dlg.Show();</instruction>
<instruction> return null;</instruction>
<instruction> }</instruction>
<instruction />
<instruction> dlg.template = "SelectionDetailsDialog";</instruction>
<instruction> dlg.detach = true;</instruction>
<instruction> dlg.title = "How should the files be selected by '" + dateSource + "' date selector";</instruction>
<instruction> dlg.Create();</instruction>
<instruction> </instruction>
<instruction> </instruction>
<instruction> dlg.Show();</instruction>
<instruction> </instruction>
<instruction> while (true) </instruction>
<instruction> {</instruction>
<instruction> var msg = dlg.GetMsg();</instruction>
<instruction> if (!msg.result) </instruction>
<instruction> break;</instruction>
<instruction />
<instruction> //Log("Msg Event = " + msg.event + " by " + msg.control);</instruction>
<instruction> if (msg.event == "click")</instruction>
<instruction> {</instruction>
<instruction> if(msg.control == "buttonOK")</instruction>
<instruction> {</instruction>
<instruction> var selectorFunction = function(date)</instruction>
<instruction> {</instruction>
<instruction> return dateSelectorFunction(date) != null;</instruction>
<instruction> }</instruction>
<instruction> return {selectorFunction : selectorFunction, fileCount : fileQueryResult.validFileCount, cachedDates : fileQueryResult.cachedDates };</instruction>
<instruction> }</instruction>
<instruction> }</instruction>
<instruction> }</instruction>
<instruction> return null;</instruction>
<instruction>}</instruction>
<instruction />
<instruction>//Enumerate the dates in a specified tab</instruction>
<instruction>function QueryFileDates(tab, dateSelector, dateSource, progress, itemType, selectOnlyFromSelectedItems)</instruction>
<instruction>{</instruction>
<instruction> var path = tab.path;</instruction>
<instruction> var minDate = DOpus.Create.Date();</instruction>
<instruction> var maxDate = DOpus.Create.Date();</instruction>
<instruction> var dates = [];</instruction>
<instruction> var dateTimes = [];</instruction>
<instruction> var cachedDates = {};</instruction>
<instruction> //var files = selectOnlyFromSelectedItems ? tab.selected : tab.all;</instruction>
<instruction> var items = tab.all;</instruction>
<instruction />
<instruction> </instruction>
<instruction> progress.Init(tab, "Querying date information in '" + tab.path + "'");</instruction>
<instruction> progress.SetStatus("Querying 0/" + items.count + " items");</instruction>
<instruction> progress.SetFiles(items.count);</instruction>
<instruction> DOpus.Delay(200);</instruction>
<instruction> progress.Show();</instruction>
<instruction> </instruction>
<instruction> var processedFilesCount = 0;</instruction>
<instruction> var validFileCount = 0;</instruction>
<instruction> var fileEnum = new Enumerator(items);</instruction>
<instruction> while (!fileEnum.atEnd())</instruction>
<instruction> {</instruction>
<instruction> var abortState = progress.GetAbortState();</instruction>
<instruction> if (abortState == "a")</instruction>
<instruction> {</instruction>
<instruction> return null;</instruction>
<instruction> }</instruction>
<instruction> else if (abortState == "p")</instruction>
<instruction> {</instruction>
<instruction> DOpus.Delay(500);</instruction>
<instruction> continue;</instruction>
<instruction> }</instruction>
<instruction />
<instruction> var item = fileEnum.item();</instruction>
<instruction> var date = dateSelector(item);</instruction>
<instruction> if(date)</instruction>
<instruction> {</instruction>
<instruction> if(maxDate < date)</instruction>
<instruction> maxDate = date;</instruction>
<instruction> else if(date < minDate)</instruction>
<instruction> minDate = date;</instruction>
<instruction> </instruction>
<instruction> var datePart = date.Format("D#yyyy.MM.dd")</instruction>
<instruction> if(!ArrayIncludes(dates, datePart))</instruction>
<instruction> dates.push(datePart);</instruction>
<instruction> </instruction>
<instruction> var dateTime = date.Format("D#yyyy.MM.dd T#HH:mm:ss");</instruction>
<instruction> if(!ArrayIncludes(dateTimes, dateTime))</instruction>
<instruction> dateTimes.push(dateTime);</instruction>
<instruction> </instruction>
<instruction> cachedDates[item] = date;</instruction>
<instruction> </instruction>
<instruction> validFileCount++;</instruction>
<instruction> }</instruction>
<instruction> fileEnum.moveNext();</instruction>
<instruction> progress.SetStatus("Querying " + ++processedFilesCount + "/" + items.count + " items (" + validFileCount + " items with '" + dateSource + "')");</instruction>
<instruction> progress.SetFilesProgress(processedFilesCount);</instruction>
<instruction> }</instruction>
<instruction> ///////////////////////////////////////////////////</instruction>
<instruction> ///////////////////////////////////////////////////</instruction>
<instruction> progress.Hide(); // 1st call HERE IT SHOULD BE GONE</instruction>
<instruction> ///////////////////////////////////////////////////</instruction>
<instruction> ///////////////////////////////////////////////////</instruction>
<instruction> </instruction>
<instruction> dates = dates.sort();</instruction>
<instruction> dateTimes = dateTimes.sort();</instruction>
<instruction> return { minDate: minDate, maxDate: maxDate, dates: dates, dateTimes: dateTimes, validFileCount: validFileCount, cachedDates : cachedDates };</instruction>
<instruction>}</instruction>
<instruction />
<instruction>//Select files in source</instruction>
<instruction>function SelectFiles(tab, selectorFunction, cachedDates, fileCount, progress)</instruction>
<instruction>{</instruction>
<instruction> var selectedFilesResultVector = DOpus.Create.Vector();</instruction>
<instruction />
<instruction> progress.SetStatus("Selecting 0/" + fileCount + " files");</instruction>
<instruction> progress.SetFiles(fileCount);</instruction>
<instruction> DOpus.Delay(200);</instruction>
<instruction> progress.Show();</instruction>
<instruction> </instruction>
<instruction> var processedFilesCount = 0; </instruction>
<instruction />
<instruction> for(var file in cachedDates) </instruction>
<instruction> {</instruction>
<instruction> var date = cachedDates[file];</instruction>
<instruction> if(selectorFunction(date))</instruction>
<instruction> {</instruction>
<instruction> //Log("Select " + file);</instruction>
<instruction> selectedFilesResultVector.push_back(file);</instruction>
<instruction> }</instruction>
<instruction> progress.SetStatus("Selecting " + processedFilesCount + "/" + fileCount + " files");</instruction>
<instruction> progress.SetFilesProgress(processedFilesCount++);</instruction>
<instruction> }</instruction>
<instruction> progress.Hide();</instruction>
<instruction> return selectedFilesResultVector;</instruction>
<instruction>}</instruction>
<instruction />
<instruction>function ArrayIncludes(array, item)</instruction>
<instruction>{</instruction>
<instruction> for(var i = 0; i < array.length; i++)</instruction>
<instruction> if(array[i] == item)</instruction>
<instruction> return true;</instruction>
<instruction> return false;</instruction>
<instruction>}</instruction>
<instruction>==SCRIPT RESOURCES</instruction>
<instruction><resources></instruction>
<instruction> <resource name="SelectionDetailsDialog" type="dialog"></instruction>
<instruction> <dialog fontsize="8" height="98" lang="english" title="How should the items be selected" width="287"></instruction>
<instruction> <control height="10" name="radioAllItemsMatching" title="All items matching" type="radio" width="262" x="5" y="4" /></instruction>
<instruction> <control height="10" name="radioDate" title="By date" type="radio" width="39" x="5" y="23" /></instruction>
<instruction> <control checked="yes" height="10" name="radioDateRange" title="By date range" type="radio" width="59" x="5" y="41" /></instruction>
<instruction> <control height="10" name="radioDateTimeRange" title="By time range" type="radio" width="60" x="5" y="58" /></instruction>
<instruction> <control height="40" name="comboDate" type="combo" width="104" x="67" y="21" /></instruction>
<instruction> <control height="40" name="comboDateStart" type="combo" width="104" x="67" y="39" /></instruction>
<instruction> <control height="40" name="comboDateEnd" type="combo" width="104" x="179" y="39" /></instruction>
<instruction> <control height="40" name="comboDateTimeStart" type="combo" width="104" x="67" y="56" /></instruction>
<instruction> <control height="40" name="comboDateTimeEnd" type="combo" width="104" x="179" y="56" /></instruction>
<instruction> <control height="14" name="buttonOK" title="OK" type="button" width="50" x="179" y="80" /></instruction>
<instruction> <control height="14" name="buttonOK" title="OK" type="button" width="50" x="179" y="80" /></instruction>
<instruction> <control close="0" height="14" name="buttonCancel" title="Cancel" type="button" width="50" x="233" y="80" /></instruction>
<instruction> <control halign="left" height="8" name="static1" title="-" type="static" valign="top" width="4" x="173" y="41" /></instruction>
<instruction> <control halign="left" height="8" name="static2" title="-" type="static" valign="top" width="4" x="173" y="59" /></instruction>
<instruction> </dialog></instruction>
<instruction> </resource></instruction>
<instruction></resources></instruction>
</function>
</button>