package rocks.inspectit.ui.rcp.editor.text; import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Set; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.forms.widgets.FormToolkit; import rocks.inspectit.ui.rcp.editor.AbstractSubView; import rocks.inspectit.ui.rcp.editor.ISubView; import rocks.inspectit.ui.rcp.editor.preferences.PreferenceEventCallback.PreferenceEvent; import rocks.inspectit.ui.rcp.editor.preferences.PreferenceId; import rocks.inspectit.ui.rcp.editor.text.input.TextInputController; /** * This class is for text views. * * @author Eduard Tudenhoefner * @author Patrice Bouillet * */ public class TextSubView extends AbstractSubView { /** * The {@link Composite}. */ private Composite composite; /** * The {@link TextInputController}. */ private TextInputController textInputController; /** * Defines if a refresh job is currently already executing. */ private volatile boolean jobInSchedule = false; /** * The constructor accepting one parameter. * * @param textInputController * An instance of the {@link TextInputController}. */ public TextSubView(TextInputController textInputController) { Assert.isNotNull(textInputController); this.textInputController = textInputController; } /** * {@inheritDoc} */ @Override public void init() { textInputController.setInputDefinition(getRootEditor().getInputDefinition()); } /** * {@inheritDoc} */ @Override public void createPartControl(Composite parent, FormToolkit toolkit) { composite = toolkit.createComposite(parent); composite.setLayout(new GridLayout(1, false)); textInputController.createPartControl(composite, toolkit); } /** * {@inheritDoc} */ @Override public void doRefresh() { if (checkDisposed()) { return; } if (!jobInSchedule) { jobInSchedule = true; Job job = new Job(getDataLoadingJobName()) { @Override protected IStatus run(IProgressMonitor monitor) { try { textInputController.doRefresh(); return Status.OK_STATUS; } catch (Throwable throwable) { // NOPMD throw new RuntimeException("Unknown exception occurred trying to refresh the view.", throwable); } finally { jobInSchedule = false; } } }; job.schedule(); } } /** * {@inheritDoc} */ @Override public Control getControl() { return composite; } /** * {@inheritDoc} */ @Override public ISelectionProvider getSelectionProvider() { return null; } /** * Returns an instance of a {@link TextInputController}. * * @return An instance of a {@link TextInputController}. */ public TextInputController getTextInputController() { return textInputController; } /** * {@inheritDoc} */ @Override public void setDataInput(List<? extends Object> data) { if (checkDisposed()) { return; } textInputController.setDataInput(data); } /** * {@inheritDoc} */ @Override public void preferenceEventFired(PreferenceEvent preferenceEvent) { } /** * {@inheritDoc} */ @Override public Set<PreferenceId> getPreferenceIds() { return Collections.emptySet(); } /** * {@inheritDoc} */ @Override public ISubView getSubViewWithInputController(Class<?> inputControllerClass) { if (Objects.equals(inputControllerClass, textInputController.getClass())) { return this; } return null; } /** * Returns true if the composite in the sub-view is disposed. False otherwise. * * @return Returns true if the composite in the sub-view is disposed. False otherwise. */ private boolean checkDisposed() { return composite.isDisposed(); } /** * {@inheritDoc} */ @Override public void dispose() { textInputController.dispose(); } }