From 778f3ece8d7acbaea8755b60084a93c1ca3a0d86 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 23 Jun 2011 13:01:52 +0200 Subject: [PATCH] double-click on .ui file opens it in Qt Designer --- .../python/PythonFileTypeFactory.java | 2 + .../src/com/jetbrains/pyqt/QtUIFileType.java | 107 ++++++++++++++++++ python/src/com/jetbrains/pyqt/uiForm.png | Bin 0 -> 879 bytes 3 files changed, 109 insertions(+) create mode 100644 python/src/com/jetbrains/pyqt/QtUIFileType.java create mode 100644 python/src/com/jetbrains/pyqt/uiForm.png diff --git a/python/pluginSrc/com/jetbrains/python/PythonFileTypeFactory.java b/python/pluginSrc/com/jetbrains/python/PythonFileTypeFactory.java index ce9fffc25beb..65178e96da8b 100644 --- a/python/pluginSrc/com/jetbrains/python/PythonFileTypeFactory.java +++ b/python/pluginSrc/com/jetbrains/python/PythonFileTypeFactory.java @@ -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.QtUIFileType; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -19,5 +20,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"); } } diff --git a/python/src/com/jetbrains/pyqt/QtUIFileType.java b/python/src/com/jetbrains/pyqt/QtUIFileType.java new file mode 100644 index 000000000000..ecc21fa1ddf4 --- /dev/null +++ b/python/src/com/jetbrains/pyqt/QtUIFileType.java @@ -0,0 +1,107 @@ +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 static QtUIFileType INSTANCE = new QtUIFileType(); + + private Icon myIcon = IconLoader.getIcon("/com/jetbrains/pyqt/uiForm.png"); + + @NotNull + @Override + public String getName() { + return "Qt UI file"; + } + + @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 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; + } + + @Override + public boolean useNativeIcon() { + return false; + } +} diff --git a/python/src/com/jetbrains/pyqt/uiForm.png b/python/src/com/jetbrains/pyqt/uiForm.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d91a05a089219209e15a8d4e535f508c6f82f5 GIT binary patch literal 879 zcmV-#1CacQP)nGY}7B45QRiz2=Gan zW(h>Wgbzwa{Ne|a`4;ThV6nZ-nABN7Bh1^T6-S$PYwvn{Jhx$6(fI%PJm>t*|2cX7 z1P@eGQ)BP#?d>y}OoTCpYU#ROo}8S#p3mpAgb>R6<%J$uD7fA3j%YOclhtaadRb?L zRN4S2d%jJ?sN5j#E6%N95qr_0=59zFg*+QO`^m$7p z5*Z7=9NbYX7Bj|02%6UL{TPwi&Ax7VJ=5A>aERKwake+i-XLhvL&fSw0trA z`PI;Cp{F!Wt3Vb3qQ@g&36Cqmb9?EUj=PL73zpl2iVMNkh*~O;x;yQq))k$Wv5D~4 zgQq{*#wS>E;1xyr+wa3l=;A@TQcAI>TaQ2%WqdVt27hPsxKF3BMc9k2Yo90Stg3C_ z_N1IjrQ%BfuP9&n;hGY>u$#6?4eXuAKg3}8D0cc@N0ZQq@$>~W5(&@9uTu3dwb;|$ z)0s>rr^v#O8i4TVgtG6mU9{WR%HHfhhT|iLu&?8Nn5_ht@1De#rWdet!$F#!NoaCc zPav5{ECD31SH3#_qq6_}F52dGu(zN104KhA1AErL1(T_a5p@uK?%n8b*i3KzoYuC# zav-2i|5*i)yz=<{coCT{^H{%i8$8g@Op?8Ff+GG8F z0adMX&>~6lwTX!G;+bb@OVj3 zxP9}slA2A@IW5c9Ecd`(TZdvnL*iBpE1k_)R^J4k6q?J;YU|ed{sY()i^U>#yPdK! zd$7tnN_q(lCRi(m9;V8U<9}o<4o~I0&sTBq z3t0$-APBBdDD