/**
*
*/
package org.jboss.tools.smooks.configuration.actions;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
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.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.ecore.xml.type.AnyType;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.jface.action.Action;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.FileEditorInput;
import org.jboss.tools.smooks.SmooksModelUtils;
import org.jboss.tools.smooks.configuration.SmooksConfigurationActivator;
import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils;
/**
* @author DartPeng
*
*/
public class OpenEditorEditInnerContentsAction extends Action {
private static Map<Object, Map<String, OpenEditorEditInnerContentsAction>> elementTempFileMap = new HashMap<Object, Map<String, OpenEditorEditInnerContentsAction>>();
private AnyType model;
private int textType = SmooksUIUtils.VALUE_TYPE_TEXT;
private String fileExtensionName = "txt"; //$NON-NLS-1$
private String editorID = null;
private IResource resource = null;
private IEditorPart tempEditor = null;
private TempFileChangeListener tempFileListener = null;
private IPartListener tempEditorlistener = null;
private EditingDomain editingDomain;
private IFile tempFile;
private Map<String, OpenEditorEditInnerContentsAction> actionMap;
private Text relateText;
public OpenEditorEditInnerContentsAction(EditingDomain domain, AnyType model, int textType,
String fileExtensionName, String editorID) {
super();
this.model = model;
this.editingDomain = domain;
this.textType = textType;
this.fileExtensionName = fileExtensionName;
this.editorID = editorID;
tempFileListener = new TempFileChangeListener();
setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(ISharedImages.IMG_OBJ_FILE));
setDescription(Messages.OpenEditorEditInnerContentsAction_OpenEditor_Des);
setText(Messages.OpenEditorEditInnerContentsAction_OpenEditor_Label);
actionMap = elementTempFileMap.get(model);
if (actionMap != null) {
OpenEditorEditInnerContentsAction oldAction = actionMap.get(getTypeKey());
if (oldAction != null) {
tempFile = oldAction.getTempFile();
// clean old listener
cleanOldActionListeners(oldAction);
if (tempFile != null) {
tempEditorlistener = createNewPartListener();
SmooksConfigurationActivator.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage()
.addPartListener(tempEditorlistener);
ResourcesPlugin.getWorkspace().addResourceChangeListener(tempFileListener);
}
}
} else {
actionMap = new HashMap<String, OpenEditorEditInnerContentsAction>();
elementTempFileMap.put(model, actionMap);
}
actionMap.put(getTypeKey(), this);
}
public OpenEditorEditInnerContentsAction(EditingDomain domain, AnyType model, int textType, String fileExtensionName) {
this(domain, model, textType, fileExtensionName, null);
}
public TempFileChangeListener getTempFileListener() {
return tempFileListener;
}
public void setTempFileListener(TempFileChangeListener tempFileListener) {
this.tempFileListener = tempFileListener;
}
public IPartListener getTempEditorlistener() {
return tempEditorlistener;
}
public void setTempEditorlistener(IPartListener tempEditorlistener) {
this.tempEditorlistener = tempEditorlistener;
}
public IFile getTempFile() {
return tempFile;
}
public void setTempFile(IFile tempFile) {
this.tempFile = tempFile;
}
public Text getRelateText() {
return relateText;
}
public void setRelateText(Text relateText) {
this.relateText = relateText;
}
private void setContent(AnyType model, String contents, int textType) {
String editValue = null;
if (textType == SmooksUIUtils.VALUE_TYPE_TEXT && model instanceof AnyType) {
editValue = SmooksModelUtils.getAnyTypeText((AnyType) model);
if (!contents.equals(editValue)) {
SmooksModelUtils.setTextToAnyType((AnyType) model, contents);
}
}
if (textType == SmooksUIUtils.VALUE_TYPE_COMMENT && model instanceof AnyType) {
editValue = SmooksModelUtils.getAnyTypeComment((AnyType) model);
if (!contents.equals(editValue)) {
SmooksModelUtils.setCommentToSmooksType(editingDomain, (AnyType) model, contents);
}
}
if (textType == SmooksUIUtils.VALUE_TYPE_CDATA && model instanceof AnyType) {
editValue = SmooksModelUtils.getAnyTypeCDATA((AnyType) model);
if (!contents.equals(editValue)) {
SmooksModelUtils.setCDATAToSmooksType(editingDomain, (AnyType) model, contents);
}
}
if (getRelateText() != null && contents != null) {
try {
Text relateText = getRelateText();
if (relateText != null) {
relateText.setText(contents);
}
} catch (Throwable t) {
t.printStackTrace();
}
}
}
private String getTypeKey() {
if (textType == SmooksUIUtils.VALUE_TYPE_TEXT) {
return "text"; //$NON-NLS-1$
}
if (textType == SmooksUIUtils.VALUE_TYPE_COMMENT) {
return "comment"; //$NON-NLS-1$
}
if (textType == SmooksUIUtils.VALUE_TYPE_CDATA) {
return "cdata"; //$NON-NLS-1$
}
return ""; //$NON-NLS-1$
}
private void cleanOldActionListeners(OpenEditorEditInnerContentsAction action) {
IPartListener pl = action.getTempEditorlistener();
IResourceChangeListener rl = action.getTempFileListener();
if (pl != null) {
SmooksConfigurationActivator.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage()
.removePartListener(pl);
}
if (rl != null) {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(rl);
}
}
private IPartListener createNewPartListener() {
IPartListener partListener = new IPartListener() {
public void partActivated(IWorkbenchPart part) {
}
public void partBroughtToTop(IWorkbenchPart part) {
}
public void partClosed(IWorkbenchPart part) {
if (tempEditor != null && part == tempEditor) {
SmooksConfigurationActivator.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage()
.removePartListener(tempEditorlistener);
ResourcesPlugin.getWorkspace().removeResourceChangeListener(tempFileListener);
try {
tempFile.delete(true, new NullProgressMonitor());
tempFile.refreshLocal(0, null);
if (actionMap != null) {
actionMap.remove(getTypeKey());
}
if (actionMap.isEmpty()) {
elementTempFileMap.remove(model);
actionMap = null;
}
tempFile = null;
} catch (CoreException e) {
// e.printStackTrace();
// ignore
}
}
}
public void partDeactivated(IWorkbenchPart part) {
}
public void partOpened(IWorkbenchPart part) {
}
};
return partListener;
}
@Override
public void run() {
IWorkbenchWindow window = SmooksConfigurationActivator.getDefault().getWorkbench().getActiveWorkbenchWindow();
try {
if (tempFile != null && tempFile.exists()) {
if (editorID != null) {
FileEditorInput editorInput1 = new FileEditorInput(tempFile);
tempEditor = window.getActivePage().openEditor(editorInput1, editorID);
} else {
tempEditor = IDE.openEditor(window.getActivePage(), tempFile);
}
return;
}
if (tempEditorlistener != null) {
SmooksConfigurationActivator.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage()
.removePartListener(tempEditorlistener);
}
if (tempFileListener != null) {
ResourcesPlugin.getWorkspace().removeResourceChangeListener(tempFileListener);
}
String editValue = null;
if (textType == SmooksUIUtils.VALUE_TYPE_TEXT && model instanceof AnyType) {
editValue = SmooksModelUtils.getAnyTypeText((AnyType) model);
}
if (textType == SmooksUIUtils.VALUE_TYPE_COMMENT && model instanceof AnyType) {
editValue = SmooksModelUtils.getAnyTypeComment((AnyType) model);
}
if (textType == SmooksUIUtils.VALUE_TYPE_CDATA && model instanceof AnyType) {
editValue = SmooksModelUtils.getAnyTypeCDATA((AnyType) model);
}
if (editValue != null) {
resource = SmooksUIUtils.getResource(model);
if (resource != null) {
IProject project = resource.getProject();
String name = generateFileName();
tempFile = project.getFile(name + "." + fileExtensionName); //$NON-NLS-1$
int i = 0;
while (tempFile.exists()) {
name += String.valueOf(i);
tempFile = project.getFile(name + "." + fileExtensionName); //$NON-NLS-1$
i++;
}
tempFile.create(new ByteArrayInputStream(editValue.getBytes()), true, new NullProgressMonitor());
tempFile.setHidden(true);
FileEditorInput editorInput = new FileEditorInput(tempFile);
editorInput = new FileEditorInput(tempFile);
if (editorID != null) {
tempEditor = window.getActivePage().openEditor(editorInput, editorID);
} else {
tempEditor = IDE.openEditor(window.getActivePage(), tempFile);
}
tempEditorlistener = createNewPartListener();
SmooksConfigurationActivator.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage()
.addPartListener(tempEditorlistener);
ResourcesPlugin.getWorkspace().addResourceChangeListener(tempFileListener);
}
}
} catch (Exception e) {
}
}
private String generateFileName() {
int number = (int) System.currentTimeMillis();
return "tempFile_" + String.valueOf(number); //$NON-NLS-1$
}
private class TempFileChangeListener implements IResourceChangeListener {
public void resourceChanged(IResourceChangeEvent event) {
try {
switch (event.getType()) {
case IResourceChangeEvent.PRE_CLOSE:
break;
case IResourceChangeEvent.PRE_DELETE:
break;
case IResourceChangeEvent.POST_CHANGE:
event.getDelta().accept(new DeltaPrinter(), IContainer.INCLUDE_HIDDEN);
break;
case IResourceChangeEvent.PRE_BUILD:
event.getDelta().accept(new DeltaPrinter(), IContainer.INCLUDE_HIDDEN);
break;
case IResourceChangeEvent.POST_BUILD:
event.getDelta().accept(new DeltaPrinter());
break;
}
} catch (Throwable t) {
}
}
}
class DeltaPrinter implements IResourceDeltaVisitor {
private String getContents() throws IOException {
File file = ((IFile) tempFile).getLocation().toFile();
FileReader fr = new FileReader(file);
BufferedReader reader = new BufferedReader(fr);
String line = reader.readLine();
String contents = ""; //$NON-NLS-1$
while (line != null) {
contents += line + "\n"; //$NON-NLS-1$
line = reader.readLine();
}
return contents;
}
public boolean visit(IResourceDelta delta) {
IResource res = delta.getResource();
switch (delta.getKind()) {
case IResourceDelta.ADDED:
break;
case IResourceDelta.REMOVED:
break;
case IResourceDelta.CHANGED:
if (res instanceof IFile) {
if (((IFile) res).getLocation().equals(tempFile.getLocation())) {
try {
setContent(model, getContents(), textType);
} catch (IOException e) {
e.printStackTrace();
}
}
}
int flags = delta.getFlags();
if ((flags & IResourceDelta.CONTENT) != 0) {
}
if ((flags & IResourceDelta.REPLACED) != 0) {
}
if ((flags & IResourceDelta.MARKERS) != 0) {
// IMarkerDelta[] markers = delta.getMarkerDeltas();
// if interested in markers, check these deltas
}
break;
}
return true; // visit the children
}
}
}