/*
* Copyright 2013 Hewlett-Packard Development Company, L.P
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.hp.alm.ali.idea.action.attachment;
import com.hp.alm.ali.idea.action.EntityAction;
import com.hp.alm.ali.idea.entity.EntityRef;
import com.hp.alm.ali.idea.model.Entity;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.fileTypes.INativeFileType;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.util.ui.UIUtil;
import javax.swing.UIManager;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.Set;
public class AttachmentOpenAction extends EntityAction {
public AttachmentOpenAction() {
super("Open", "Download and open locally", UIManager.getIcon("Tree.openIcon"));
}
@Override
protected Set<String> getSupportedEntityTypes() {
return Collections.singleton("attachment");
}
@Override
public void update(AnActionEvent event) {
Entity entity = getEntity(event);
if(entity != null && "attachment".equals(entity.getType())) {
String filename = entity.getPropertyValue("name");
String size = entity.getPropertyValue("file-size");
if(filename != null && size != null && isAllowed(filename, Integer.valueOf(size))) {
event.getPresentation().setVisible(true);
event.getPresentation().setEnabled(true);
return;
}
}
event.getPresentation().setVisible(false);
event.getPresentation().setEnabled(false);
}
@Override
protected void actionPerformed(AnActionEvent event, Project project, Entity entity) {
openAttachment(project, entity.getPropertyValue("name"), new EntityRef(entity.getPropertyValue("parent-type"), Integer.valueOf(entity.getPropertyValue("parent-id"))), Integer.valueOf(entity.getPropertyValue("file-size")));
}
public static boolean isAllowed(String filename, int size) {
if (filename.endsWith(".url") || size > 10000000) {
// no Maya style hyperlinks
// avoid big files too
return false;
} else {
return true;
}
}
public static void openAttachment(final Project project, String name, EntityRef parent, int size) {
try {
final File file;
boolean agmLink = name.endsWith(".agmlink");
if (agmLink) {
// for the file to open correctly, there must be no trailing extension
file = File.createTempFile("tmp", "_" + name.replaceFirst("\\.agmlink$", ""));
} else {
file = File.createTempFile("tmp", "_" + name);
}
final Runnable openFile = new Runnable() {
@Override
public void run() {
String url = VirtualFileManager.constructUrl(LocalFileSystem.PROTOCOL, FileUtil.toSystemIndependentName(file.getAbsolutePath()));
final VirtualFile virtualFile = VirtualFileManager.getInstance().refreshAndFindFileByUrl(url);
UIUtil.invokeLaterIfNeeded(new Runnable() {
public void run() {
if(virtualFile != null) {
FileEditor[] editors = project.getComponent(FileEditorManager.class).openFile(virtualFile, true);
if(editors.length > 0) {
return;
}
FileType type = FileTypeManager.getInstance().getKnownFileTypeOrAssociate(virtualFile, project);
if (type instanceof INativeFileType && ((INativeFileType) type).openFileInAssociatedApplication(project, virtualFile)) {
return;
}
}
Messages.showWarningDialog("No editor seems to be associated with this file type. Try to download and open the file manually.", "Not Supported");
}
});
}
};
if (agmLink) {
ProgressManager.getInstance().run(new AttachmentAgmLinkDownloadTask(project, file, name, size, parent, openFile));
} else {
ProgressManager.getInstance().run(new AttachmentDownloadTask(project, file, name, size, parent, openFile));
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}