package com.laboki.eclipse.plugin.smartsave.contexts;
import java.util.ArrayList;
import java.util.Arrays;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.jobs.IJobManager;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextOperationTarget;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPartService;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.MultiPageEditorPart;
import com.google.common.base.Optional;
import com.laboki.eclipse.plugin.smartsave.Activator;
import com.laboki.eclipse.plugin.smartsave.listeners.BaseListener;
import com.laboki.eclipse.plugin.smartsave.main.EventBus;
import com.laboki.eclipse.plugin.smartsave.main.Scheduler;
import com.laboki.eclipse.plugin.smartsave.preferences.Store;
import com.laboki.eclipse.plugin.smartsave.task.BaseTask;
public enum EditorContext {
INSTANCE;
public static final String PLUGIN_ID = Activator.PLUGIN_ID;
public static final IJobManager JOB_MANAGER = Job.getJobManager();
public static final IWorkbench WORKBENCH = PlatformUI.getWorkbench();
public static final Display DISPLAY = EditorContext.WORKBENCH.getDisplay();
private static final int MILLI_SECONDS_UNIT = 1000;
public static Optional<Shell>
getShell() {
return Optional.fromNullable(EditorContext.WORKBENCH.getModalDialogShellProvider()
.getShell());
}
public static Optional<IPartService>
getPartService() {
final Optional<IWorkbenchWindow> window =
EditorContext.getActiveWorkbenchWindow();
if (!window.isPresent()) return Optional.absent();
return Optional.fromNullable((IPartService) window.get()
.getService(IPartService.class));
}
public static Optional<IEditorPart>
getEditor() {
final Optional<IWorkbenchWindow> window =
EditorContext.getActiveWorkbenchWindow();
if (!window.isPresent()) return Optional.absent();
final Optional<IWorkbenchPage> page = EditorContext.getActivePage(window);
if (!page.isPresent()) return Optional.absent();
return Optional.fromNullable(page.get().getActiveEditor());
}
private static Optional<IWorkbenchWindow>
getActiveWorkbenchWindow() {
return Optional.fromNullable(EditorContext.WORKBENCH.getActiveWorkbenchWindow());
}
private static Optional<IWorkbenchPage>
getActivePage(final Optional<IWorkbenchWindow> activeWorkbenchWindow) {
return Optional.fromNullable(activeWorkbenchWindow.get().getActivePage());
}
public static Optional<SourceViewer>
getView(final Optional<IEditorPart> editor) {
if (!editor.isPresent()) return Optional.absent();
return Optional.fromNullable((SourceViewer) editor.get()
.getAdapter(ITextOperationTarget.class));
}
public static Optional<StyledText>
getBuffer(final Optional<IEditorPart> editor) {
final Optional<Control> control = EditorContext.getControl(editor);
if (!control.isPresent()) return Optional.absent();
return Optional.fromNullable((StyledText) EditorContext.getControl(editor)
.get());
}
public static Optional<Control>
getControl(final Optional<IEditorPart> editor) {
if (!editor.isPresent()) return Optional.absent();
return Optional.fromNullable((Control) editor.get()
.getAdapter(Control.class));
}
public static Optional<IFile>
getFile(final Optional<IEditorPart> editor) {
return FileContext.getFile(editor);
}
public static Optional<IDocument>
getDocument(final Optional<IEditorPart> editor) {
return DocumentContext.getDocument(editor);
}
public static void
savePart(final Optional<IEditorPart> editor) {
if (!editor.isPresent()) return;
editor.get().getSite().getPage().saveEditor(editor.get(), false);
}
public static boolean
isEditorPart(final IWorkbenchPart part) {
return part instanceof IEditorPart;
}
public static boolean
isMultiEditorPart(final IWorkbenchPart part) {
return part instanceof MultiPageEditorPart;
}
public static boolean
canSaveAutomatically(final Optional<IEditorPart> editor) {
if (!editor.isPresent()) return false;
if (!Store.getCanSaveAutomatically()) return false;
if (EditorContext.isBlacklisted(editor)) return false;
return true;
}
public static void
toggleCanSaveAutomatically() {
Store.toggleCanSaveAutomatically();
}
public static void
setCanSaveAutomatically(final boolean canSave) {
Store.setCanSaveAutomatically(canSave);
}
public static int
getSaveIntervalInMilliSeconds() {
return (Store.getSaveIntervalInSeconds() * EditorContext.MILLI_SECONDS_UNIT);
}
public static ArrayList<String>
getBlacklist() {
final String blacklist = Store.getContentTypeBlacklist();
if (blacklist.isEmpty()) return new ArrayList<>();
return new ArrayList<>(Arrays.asList(blacklist.split(";")));
}
public static void
setBlacklist(final String contentTypes) {
Store.setContentTypeBlacklist(contentTypes);
}
public static boolean
isBlacklisted(final Optional<IEditorPart> editor) {
final ArrayList<String> blacklist = EditorContext.getBlacklist();
if (blacklist.isEmpty()) return false;
if (blacklist.contains(ContentTypeContext.getContentTypeId(editor))) return true;
return false;
}
public static IContentType[]
getContentTypes() {
return ContentTypeContext.getContentTypes();
}
public static void
asyncExec(final Runnable runnable) {
if (EditorContext.displayDoesNotExist()) return;
EditorContext.DISPLAY.asyncExec(runnable);
}
public static void
syncExec(final Runnable runnable) {
if (EditorContext.displayDoesNotExist()) return;
EditorContext.DISPLAY.syncExec(runnable);
}
private static boolean
displayDoesNotExist() {
return !EditorContext.displayExists();
}
private static boolean
displayExists() {
return !EditorContext.displayIsDisposed();
}
private static boolean
displayIsDisposed() {
if (EditorContext.DISPLAY == null) return true;
return EditorContext.DISPLAY.isDisposed();
}
public static void
cancelSaverTasks() {
EditorContext.JOB_MANAGER.cancel(Scheduler.FAMILY);
EditorContext.JOB_MANAGER.cancel(BaseListener.FAMILY);
}
public static void
cancelEventTasks() {
EditorContext.JOB_MANAGER.cancel(EventBus.FAMILY);
}
public static void
cancelPluginTasks() {
EditorContext.JOB_MANAGER.cancel(BaseTask.FAMILY);
}
}