In the end, I pulled the old trick out of the bag and got an acceptable solution. Documenting it here for posterity, but love hearing if someone comes up with a better way.
First, create an empty ViewPage from the call that does nothing but says “This view is intentionally left blank” or some other useful information for the user to let them know that the update was successful, just so that the view can be closed. In our case, we will explain where to find the equivalent functionality now and have a link that they can click on, which will lead them to that part of the application.
Secondly, register this view class as the implementation of the old view identifier and mark it as unrecoverable, i.e.
<view allowMultiple="false" category="com.foobar.category" class="com.foobar.ui.views.DeprecatedView" id="com.foobar.ui.views.OldView" name="My Old View" restorable="false"/>
Finally, we need to get the trick out of the bag. Create a new action and put your view on it. This will filter out your old view from the Show View, Other ... dialog box so that new users do not see it again. For instance:
<extension point="org.eclipse.ui.activities"> <activity name="Deprecated" description="Supress old views that are no longer used." id="com.foobar.hidden"> </activity> <activityPatternBinding activityId="com.foobar.hidden" pattern="com.foorbar.plugin/com.foobar.ui.views.OldView" isEqualityPattern="true"> </activityPatternBinding> </extension>
The user interface is that after the update, if the old view was visible, the user receives a good message explaining why and what they should tell what to do (i.e. close the old view and move). In any case, when they close Eclipse and restart this view, they no longer appear in perspective. New users never see the view or any hints of it in the Show View dialog box, so after several releases, when I'm sure everything has been updated, I can remove the obsolete view registration from the plugin.xml file, etc.
This is the best experience I could come up with - but I'm glad to hear if people think about the best. If you want to learn more about Eclipse filtering actions , then look here - this is the only way to find filtering of the registered view when I went through the ViewRegistry and ShowViewDialog code.