package bndtools.jareditor.internal;

import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IURIEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.ide.ResourceUtil;

import bndtools.jareditor.internal.utils.SWTConcurrencyUtil;

public class JAREditor extends FormEditor implements IResourceChangeListener {

	JARContentPage	contentPage	= new JARContentPage(this, "contentPage", "Content");
	JARPrintPage	printPage	= new JARPrintPage(this, "printPage", "Print");

	@Override
	protected void addPages() {
		try {
			addPage(contentPage);
			addPage(printPage);
		} catch (PartInitException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void doSave(final IProgressMonitor monitor) {}

	@Override
	public void doSaveAs() {}

	@Override
	public boolean isSaveAsAllowed() {
		return false;
	}

	@Override
	public void init(final IEditorSite site, final IEditorInput input) throws PartInitException {
		super.init(site, input);

		IResource resource = ResourceUtil.getResource(input);
		if (resource != null) {
			resource.getWorkspace()
				.addResourceChangeListener(this);
		}
	}

	@Override
	protected void setInput(final IEditorInput input) {
		super.setInput(input);
		String name = "unknown";
		if (input instanceof IFileEditorInput) {
			name = ((IFileEditorInput) input).getFile()
				.getName();
		} else if (input instanceof IURIEditorInput) {
			name = ((IURIEditorInput) input).getName();
		}
		setPartName(name);

		contentPage.setSelectedPath(new String[] {
			"META-INF/", "MANIFEST.MF"
		});
	}

	protected void updateContent(@SuppressWarnings("unused")
	final IEditorInput input) {
		Runnable update = () -> {
			Control c = (contentPage == null) ? null : contentPage.getPartControl();
			if ((c != null) && !c.isDisposed()) {
				String[] selectedPath = contentPage.getSelectedPath();
				contentPage.getManagedForm()
					.refresh();
				contentPage.setSelectedPath(selectedPath);
			}

			c = (printPage == null) ? null : printPage.getPartControl();
			if ((c != null) && !c.isDisposed()) {
				printPage.refresh();
			}
		};
		try {
			SWTConcurrencyUtil.execForDisplay(contentPage.getPartControl()
				.getDisplay(), update);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void dispose() {
		IResource resource = ResourceUtil.getResource(getEditorInput());

		super.dispose();

		if (resource != null) {
			resource.getWorkspace()
				.removeResourceChangeListener(this);
		}
	}

	@Override
	public void resourceChanged(final IResourceChangeEvent event) {
		IResource myResource = ResourceUtil.getResource(getEditorInput());

		IResourceDelta delta = event.getDelta();
		if (delta == null) {
			return;
		}

		IPath fullPath = myResource.getFullPath();
		delta = delta.findMember(fullPath);
		if (delta == null) {
			return;
		}

		if (delta.getKind() == IResourceDelta.REMOVED) {
			close(false);
		} else if (delta.getKind() == IResourceDelta.CHANGED) {
			updateContent(getEditorInput());
		}
	}
}
