Как закрыть ViewPart в Eclipse? - PullRequest
       18

Как закрыть ViewPart в Eclipse?

9 голосов
/ 04 августа 2009

У меня есть представление в Eclipse (реализуемое классом, расширяющим org.eclipse.ui.part.ViewPart), которое мне нужно закрыть. Я имею в виду совсем близко, а не просто спрятаться. Я хочу, чтобы новый экземпляр ViewPart создавался, когда пользователь (или мой код) просит снова открыть представление.

Единственный метод, который я нашел, был IWorkbenchPage.hideView, который скрывает представление, но не полностью им распоряжается. Вызов dispose для представления также не влияет.

Кстати, мой взгляд определяется как allowMultiple="false", но я пробовал с true, и это не имело никакого значения.

Любая помощь будет оценена.

Ответы [ 6 ]

8 голосов
/ 06 сентября 2009

Я нашел проблему в конце концов. Если представление открыто в нескольких ракурсах, его скрытие в одной перспективе не приведет к его закрытию. Можно перебирать всю открытую перспективу и искать вид. Сокрытие этого на всех перспективах закроет это.

3 голосов
/ 04 августа 2009

Я думаю, что упомянутый вами метод IWorkbenchPage.hideView() - единственный, доступный для программного закрытия вида. Я также думаю, что это имя метода должно быть closeView (), потому что оно действительно закрывает представление.

Я использовал этот метод некоторое время (с allowMultiple=true представлениями), и после отладки кажется, что мой view.dispose() метод вызывается каждый раз, когда я вызываю hideView().

В следующий раз, когда я снова открою это представление (я имею в виду из своего кода, а не из пользовательского интерфейса), Eclipse создаст новое, и метод createPartControl() будет вызван снова.

Более того, представление иерархии вызовов сообщило мне, что hideView() должен вызывать dispose method() ....

hideView() >> releaseView() >> partRemoved() >> disposePart() >> dispose() >> doDisposePart() >> doDisposePart() >> dispose()

Надеюсь, это поможет ...

Последний вопрос, как вы проверили, что ваше мнение было неправильно расположено?

0 голосов
/ 21 апреля 2016

Чтобы закрыть представления, открытые в другом ракурсе, я переопределяю priorityDeactivation () org.eclipse.ui.PerspectiveAdapter.

public void perspectiveDeactivated(IWorkbenchPage page,
        IPerspectiveDescriptor perspective) {
    super.perspectiveDeactivated(page, perspective);
    boolean myPerspective = MyPerspective.PERSPECTIVE_ID.equals(perspective.getId());
    if(!myPerspective) {
        //close Error Log view if it is opened in any perspective except My perspective. 
        IViewPart errorView = page.findView("org.eclipse.pde.runtime.LogView");
        if(errorView != null) {
            page.hideView(errorView);
        }
    }
}

Моим требованием было закрыть представление «Журнал ошибок». Выше код может быть изменен, чтобы закрыть любое представление.

0 голосов
/ 18 октября 2014

Чтобы избавиться от ViewPart при закрытии перспективы, мы использовали следующий код:

IWorkbenchWindow workbenchWindow = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (workbenchWindow != null) {
    workbenchWindow.addPerspectiveListener(new PerspectiveAdapter() {
        @Override
        public void perspectiveActivated(IWorkbenchPage page,
                IPerspectiveDescriptor perspectiveDescriptor) {
            super.perspectiveActivated(page, perspectiveDescriptor);
        }
        @Override
        public void perspectiveDeactivated(IWorkbenchPage page,
                IPerspectiveDescriptor perspective) {
            super.perspectiveDeactivated(page, perspective);
            page.closePerspective(perspective, false, true);
        }
    });
}

В результате page.closePerspective(perspective, false, true); ViewPart, открытый в перспективе, будет удален.

0 голосов
/ 07 марта 2013

Я переопределил метод dispose из IWorkbenchPart, и это сработало. У меня было что-то вроде этого в моем переопределенном методе утилизации:

public void dispose() {
    super.dispose();
    IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
    if (page != null) {
        IViewReference[] viewReferences = page.getViewReferences();
        for (IViewReference ivr : viewReferences) {
            if (ivr.getId().equalsIgnoreCase("your view id")
                    || ivr.getId().equalsIgnoreCase("more view id if you want to close more than one at a time")) {
                page.hideView(ivr);
            }
        }
    }
}
0 голосов
/ 04 августа 2009

Org.eclipse.ui.internal.ViewFactory имеет метод releaseView, который, я думаю, полностью закрывает представление (хотя я не уверен). Требуется IViewReference.

Вы можете получить доступ к ViewFactory, вызвав Perspective.getViewFactory, и вы можете получить доступ к перспективе, а затем передать ей IViewReference для освобождения представления.

IWorkbenchPage page = 
Workbench.getInstance().getActiveWorkbenchWindow().getActivePage()

Perspective perspective = page.getPerspective();

String viewId = "myViewId"; //defined by you

//get the reference for your viewId
IViewReference ref = page.findViewReference(viewId);

//release the view
perspective.getViewFactory.releaseView(ref);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...