Как подписаться на событие OpenProject в Eclipse? - PullRequest
4 голосов
/ 05 октября 2011

Я разрабатываю плагин Eclipse.

Я читал, как подписаться на получение уведомлений, когда проект будет закрыт, используя интерфейс IResourceChangeListener и используя PRE_CLOSE тип события.Следующий текст взят из справки Eclipse :

Уведомляет слушателей о том, что проект собирается закрыться.Это событие может использоваться для извлечения и сохранения необходимой информации из представления в памяти (например, свойств сеанса) проекта до его закрытия.(Когда проект закрыт, представление в памяти удаляется).Рабочая область заблокирована (никакие ресурсы не могут быть обновлены) во время этого события.Событие содержит проект, который закрывается.

Я не нашел, как получить уведомление, когда проект должен быть открыт.

Ответы [ 3 ]

9 голосов
/ 05 октября 2011

Вы можете создать свой собственный IResourceChangeListener и отфильтровать тип дельты по IResourceDelta.OPEN, который влияет только на IP-проекты и срабатывает как при открытии, так и при закрытии проекта:

public void resourceChanged(IResourceChangeEvent event) {
    if (event == null || event.getDelta() == null)
        return;
    event.getDelta().accept(new IResourceDeltaVisitor() {
        public boolean visit(IResourceDelta delta) throws CoreException {
            if (delta.getKind() == IResourceDelta.OPEN)
                final IResource resource = delta.getResource();
                if (!(resource instanceof IProject))
                    return;
               //do your stuff and check the project is opened or closed
        }
}

Полезная ссылка: http://www.eclipse.org/articles/Article-Resource-deltas/resource-deltas.html

5 голосов
/ 13 ноября 2014

Я знаю, что на этот вопрос уже давно дан ответ, но я хочу обновить его рабочим фрагментом кода, на случай, если кому-нибудь понадобится. Я проверил это на Затмении Луны, Индиго и Кеплера.

public void resourceChanged(final IResourceChangeEvent event) {
    if (event == null || event.getDelta() == null) {
        return;
    }

    try {
        event.getDelta().accept(new IResourceDeltaVisitor() {
            public boolean visit(final IResourceDelta delta) throws CoreException {
                IResource resource = delta.getResource();
                if (((resource.getType() & IResource.PROJECT) != 0)
                        && resource.getProject().isOpen()
                        && delta.getKind() == IResourceDelta.CHANGED
                        && ((delta.getFlags() & IResourceDelta.OPEN) != 0)) {

                    IProject project = (IProject)resource;
                    projectOpened(project);
                }
                return true;
            }
        });
    } catch (CoreException e) {
        e.printStackTrace();
    }
}
4 голосов
/ 05 октября 2011

IResourceChangeEvent равен POST_CHANGE и связан IResourceDelta вид равен IResourceDelta.CHANGED, а флаги включают IResourceDelta.OPEN.

...