[ImageJ-devel] Please don't quit

Curtis Rueden ctrueden at wisc.edu
Wed Nov 5 12:01:38 CST 2014


Hi Lee,

> > 2) Create a CellProfilerApp plugin
>
> It looks like I have to do this

It is nice for other reasons, too: then CellProfiler will have a "presence"
in the context, so if you run e.g. the SystemInformation command [1], you
will see CellProfiler in the output! :-)

Also, if you didn't see my blog post on quitting a couple of months, that
may be worth a read:

http://imagej.net/2014-07-11_-_Fiji_won't_quit!#Other_complications

Especially the "Other complications" section which explains that there are
multiple very different code paths for quitting.

So depending on what code CellProfiler is invoking -- A) ij.ImageJ#quit()
vs. B) org.scijava.Context#dispose() vs. C) publication of an AppQuitEvent
-- you may experience different behavior.

It has been long enough now that all the details do not spring to mind, but
please reply back with any further questions and we can iron out the
details. I'd _like_ to believe that the quit architecture is as elegant &
configurable as possible now, but feel free to prove me wrong if there are
any roadblocks.

Regards,
Curtis

[1]
https://github.com/scijava/scijava-plugins-commands/blob/scijava-plugins-commands-0.1.7/src/main/java/org/scijava/plugins/commands/debug/SystemInformation.java#L95-L116

On Wed, Nov 5, 2014 at 11:44 AM, Lee Kamentsky <leek at broadinstitute.org>
wrote:

> Thanks, Curtis:
>
> On Wed, Nov 5, 2014 at 12:33 PM, Curtis Rueden <ctrueden at wisc.edu> wrote:
>
>> Hi Lee,
>>
>> So, there are two potential ways I would suggest to achieve your goal:
>>
>> 1) Set the OptionsMisc exitWhenQuitting to false. This is handy if you
>> don't need a lot of control over exactly what happens when quit() is
>> called, but you just want to stop the System.exit(0) from firing.
>>
>> I have code to do this, but in the upgrade to the latest, perhaps I'm not
> running it and setting exitWhenQuitting to false.
>
>> 2) Create a CellProfilerApp plugin and set it to a higher priority than
>> ImageJ. This solution makes the most sense to me because it gives you more
>> flexibility over the behavior of a couple other operations, too: about()
>> and prefs().
>>
> It looks like I have to do this, because we don't want to lose the
> context. I think that will work out OK.
>
>>
>>
>> https://github.com/scijava/scijava-common/blob/scijava-common-2.35.0/src/main/java/org/scijava/app/App.java
>>
>> Regards,
>> Curtis
>>
>> On Wed, Nov 5, 2014 at 10:23 AM, Lee Kamentsky <leek at broadinstitute.org>
>> wrote:
>>
>>> Oops never mind, what I tried actually worked. AppQuitEvent.consume()
>>> did the trick. Go figure - you guys really threw the whole kitchen sink
>>> into it, didn't you?
>>>
>>> @Plugin(type = Service.class, priority = Priority.HIGH_PRIORITY)
>>> public class CellProfilerAppService extends DefaultAppService {
>>> static boolean canQuit = false;
>>> public static void allowQuit() {
>>> canQuit = true;
>>> }
>>> public static void preventQuit() {
>>> canQuit = false;
>>> }
>>> @EventHandler
>>> public void onEvent(final AppQuitEvent event) {
>>> if (canQuit) {
>>> super.onEvent(event);
>>> } else {
>>> final UIService uiService = getContext().getService(UIService.class);
>>> final LogService logService = getContext().getService(LogService.class);
>>> if (uiService.isVisible()) {
>>> UserInterface ui = uiService.getDefaultUI();
>>> logService.info("Quit action: hide the application frame");
>>> ui.getApplicationFrame().setVisible(false);
>>> } else {
>>> logService.info("Quit action: do nothing");
>>> }
>>> event.consume();
>>> }
>>> }
>>>
>>> }
>>>
>>>
>>> On Wed, Nov 5, 2014 at 11:15 AM, Lee Kamentsky <leek at broadinstitute.org>
>>> wrote:
>>>
>>>> Hi all,
>>>> I had a class (
>>>> https://github.com/CellProfiler/CellProfiler/blob/master/java/src/main/java/org/cellprofiler/ijutils/CellProfilerAppEventService.java)
>>>> that implemented the deprecated AppEventService whose purpose was to
>>>> prevent ImageJ from quitting if a user closed its window by overriding
>>>> AppEventService.quit(). Quitting is pretty devastating for CellProfiler
>>>> since the process closes when the user's probable intent was to hide the
>>>> window.
>>>>
>>>> I'm hoping someone can give me a hint about how to do it now - I
>>>> thought I'd cheat by asking instead of figuring it out myself.
>>>>
>>>> Thanks in advance,
>>>> --Lee
>>>>
>>>
>>>
>>> _______________________________________________
>>> ImageJ-devel mailing list
>>> ImageJ-devel at imagej.net
>>> http://imagej.net/mailman/listinfo/imagej-devel
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://imagej.net/pipermail/imagej-devel/attachments/20141105/f315c454/attachment.html>


More information about the ImageJ-devel mailing list