/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.api.editor.events.doc;
import com.google.web.bindery.event.shared.EventBus;
import com.google.web.bindery.event.shared.HandlerRegistration;
import org.eclipse.che.commons.annotation.Nullable;
import org.eclipse.che.ide.api.editor.document.DocumentHandle;
import org.eclipse.che.ide.api.editor.events.DocumentReadyEvent;
import org.eclipse.che.ide.api.editor.events.DocumentReadyHandler;
/**
* Wrapper around components that need to wait for documents to be ready.
*/
public class DocReadyWrapper<T> {
private DocReadyInit<T> docReadyInit;
private final T wrapped;
private HandlerRegistration docReadyRegistration;
private DocumentHandle documentHandle;
public DocReadyWrapper(final EventBus generalEventBus, final T wrapped) {
this(generalEventBus, null, wrapped);
}
public DocReadyWrapper(final EventBus generalEventBus, @Nullable final DocReadyInit<T> init, final T wrapped) {
this.docReadyInit = init;
this.wrapped = wrapped;
this.docReadyRegistration = generalEventBus.addHandler(DocumentReadyEvent.TYPE,
new DocumentReadyHandler() {
@Override
public void onDocumentReady(final DocumentReadyEvent event) {
if (event == null) {
return;
}
// stop listening DocReady events
if (docReadyRegistration != null) {
docReadyRegistration.removeHandler();
}
documentHandle = event.getDocument().getDocumentHandle();
final DocReadyInit<T> initializer = DocReadyWrapper.this.docReadyInit;
if (initializer != null) {
initializer.initialize(documentHandle, DocReadyWrapper.this.wrapped);
}
}
});
}
/**
* Remove all active handlers.
*/
public void release() {
if (this.docReadyRegistration != null) {
docReadyRegistration.removeHandler();
docReadyRegistration = null;
}
}
protected void setDocReadyInit(final DocReadyInit<T> initializer) {
this.docReadyInit = initializer;
}
/** Interface for initialization that occurs when the document is ready. */
public interface DocReadyInit<T> {
/** Triggered when the document is ready. */
public void initialize(DocumentHandle documentHandle, T wrapped);
}
}