double-click on .ts file opens it in Qt Linguist

This commit is contained in:
Dmitry Jemerov
2011-06-24 10:26:06 +02:00
parent 778f3ece8d
commit 16bbbb2870
5 changed files with 142 additions and 88 deletions
@@ -4,6 +4,7 @@ import com.intellij.openapi.fileTypes.FileTypeConsumer;
import com.intellij.openapi.fileTypes.FileTypeFactory;
import com.intellij.ultimate.PluginVerifier;
import com.intellij.ultimate.UltimateVerifier;
import com.jetbrains.pyqt.QtTranslationsFileType;
import com.jetbrains.pyqt.QtUIFileType;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -21,5 +22,6 @@ public class PythonFileTypeFactory extends FileTypeFactory {
public void createFileTypes(@NonNls @NotNull final FileTypeConsumer consumer) {
consumer.consume(PythonFileType.INSTANCE, "py;pyw;");
consumer.consume(QtUIFileType.INSTANCE, "ui");
consumer.consume(QtTranslationsFileType.INSTANCE, "ts");
}
}
@@ -0,0 +1,111 @@
package com.jetbrains.pyqt;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.INativeFileType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.jetbrains.python.psi.impl.PyQualifiedName;
import com.jetbrains.python.psi.resolve.ResolveImportUtil;
import com.jetbrains.python.sdk.PythonSdkType;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.io.IOException;
import java.util.List;
/**
* @author yole
*/
public abstract class QtFileType implements FileType, INativeFileType {
private final String myName;
private final String myDescription;
private final String myDefaultExtension;
private final Icon myIcon;
protected QtFileType(String name, String description, String defaultExtension, Icon icon) {
myName = name;
myDescription = description;
myDefaultExtension = defaultExtension;
myIcon = icon;
}
@NotNull
@Override
public String getName() {
return myName;
}
@NotNull
@Override
public String getDescription() {
return myDescription;
}
@NotNull
@Override
public String getDefaultExtension() {
return myDefaultExtension;
}
@Override
public Icon getIcon() {
return myIcon;
}
@Override
public boolean isBinary() {
return true;
}
@Override
public boolean isReadOnly() {
return false;
}
@Override
public String getCharset(@NotNull VirtualFile file, byte[] content) {
return null;
}
@Override
public boolean openFileInAssociatedApplication(Project project, VirtualFile file) {
if (SystemInfo.isWindows) {
Module module = ModuleUtil.findModuleForFile(file, project);
if (module == null) {
return false;
}
Sdk sdk = PythonSdkType.findPythonSdk(module);
if (sdk == null) {
return false;
}
List<PsiElement> qt4 =
ResolveImportUtil.resolveModulesInRootProvider(sdk.getRootProvider(), module, PyQualifiedName.fromComponents("PyQt4"));
for (PsiElement psiElement : qt4) {
if (psiElement instanceof PsiDirectory) {
VirtualFile designer = ((PsiDirectory)psiElement).getVirtualFile().findChild(getToolName() + ".exe");
if (designer != null) {
try {
Runtime.getRuntime().exec(new String[] { designer.getPath(), file.getPath() } );
}
catch (IOException e) {
Messages.showErrorDialog(project, "Failed to run Qt Designer: " + e.getMessage(), "Error");
}
return true;
}
}
}
}
// TODO
return true;
}
protected abstract String getToolName();
}
@@ -0,0 +1,24 @@
package com.jetbrains.pyqt;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.util.IconLoader;
/**
* @author yole
*/
public class QtTranslationsFileType extends QtFileType implements FileType {
public static QtTranslationsFileType INSTANCE = new QtTranslationsFileType();
protected QtTranslationsFileType() {
super("Qt translations file", "Qt Linguist translations file", "ts", IconLoader.getIcon("/com/jetbrains/pyqt/tsFile.png"));
}
protected String getToolName() {
return "linguist";
}
@Override
public boolean useNativeIcon() {
return false;
}
}
@@ -1,103 +1,20 @@
package com.jetbrains.pyqt;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.INativeFileType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.IconLoader;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.jetbrains.python.psi.impl.PyQualifiedName;
import com.jetbrains.python.psi.resolve.ResolveImportUtil;
import com.jetbrains.python.sdk.PythonSdkType;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.io.IOException;
import java.util.List;
/**
* @author yole
*/
public class QtUIFileType implements FileType, INativeFileType {
public class QtUIFileType extends QtFileType implements FileType {
public static QtUIFileType INSTANCE = new QtUIFileType();
private Icon myIcon = IconLoader.getIcon("/com/jetbrains/pyqt/uiForm.png");
@NotNull
@Override
public String getName() {
return "Qt UI file";
protected QtUIFileType() {
super("Qt UI file", "Qt UI Designer form file", "ui", IconLoader.getIcon("/com/jetbrains/pyqt/uiForm.png"));
}
@NotNull
@Override
public String getDescription() {
return "Qt UI Designer form file";
}
@NotNull
@Override
public String getDefaultExtension() {
return "ui";
}
@Override
public Icon getIcon() {
return myIcon;
}
@Override
public boolean isBinary() {
return true;
}
@Override
public boolean isReadOnly() {
return false;
}
@Override
public String getCharset(@NotNull VirtualFile file, byte[] content) {
return null;
}
@Override
public boolean openFileInAssociatedApplication(Project project, VirtualFile file) {
if (SystemInfo.isWindows) {
Module module = ModuleUtil.findModuleForFile(file, project);
if (module == null) {
return false;
}
Sdk sdk = PythonSdkType.findPythonSdk(module);
if (sdk == null) {
return false;
}
List<PsiElement> qt4 =
ResolveImportUtil.resolveModulesInRootProvider(sdk.getRootProvider(), module, PyQualifiedName.fromComponents("PyQt4"));
for (PsiElement psiElement : qt4) {
if (psiElement instanceof PsiDirectory) {
VirtualFile designer = ((PsiDirectory)psiElement).getVirtualFile().findChild("designer.exe");
if (designer != null) {
try {
Runtime.getRuntime().exec(new String[] { designer.getPath(), file.getPath() } );
}
catch (IOException e) {
Messages.showErrorDialog(project, "Failed to run Qt Designer: " + e.getMessage(), "Error");
}
return true;
}
}
}
}
// TODO
return true;
protected String getToolName() {
return "designer";
}
@Override
Binary file not shown.

After

Width:  |  Height:  |  Size: 492 B