From 6af25738be6e86f48a6c579927dc970cd9f84739 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 29 Oct 2010 18:45:35 +0400 Subject: [PATCH 1/7] tabbed android run configuration editor interface --- .../messages/AndroidBundle.properties | 7 +- .../run/AndroidRunConfigurationEditor.form | 248 ++++++++++-------- .../run/AndroidRunConfigurationEditor.java | 1 + 3 files changed, 147 insertions(+), 109 deletions(-) diff --git a/plugins/android/resources/messages/AndroidBundle.properties b/plugins/android/resources/messages/AndroidBundle.properties index 8509626ac465..6f38b39de4eb 100644 --- a/plugins/android/resources/messages/AndroidBundle.properties +++ b/plugins/android/resources/messages/AndroidBundle.properties @@ -88,13 +88,11 @@ logging.level.label=Logging level: android.run.configuration.do.nothing.label=Do not launch Activity android.debug.port.busy.error=The process debug port is already in use target.package.not.specified.error=Target package is not specified in AndroidManifest.xml -android.run.configuration.emulator.options.label=Emulator launch options android.run.configuration.network.spped.label=Network Speed: android.run.configuration.network.latency.label=Network Latency: android.run.configuration.wipe.user.data.label=Wipe user data android.run.configuration.disable.boot.animation.label=Disable boot animation android.run.configuration.command.line.label=Additional command line options -android.run.configuration.log.options.title=Logcat options android.run.configuration.logcat.skip.content.label=Clear log before launch android.avd.error.title=AVD error cant.load.avds.error.prefix=Cannot reload AVD list: @@ -209,4 +207,7 @@ android.enable.ddms.action.description=Enable/disable DDMS service android.ddms.disabled.error=You have to enable DDMS service to launch debugging. Do you want to do that? android.ddms.disabled.dialog.title=DDMS disabled android.dex.compiler.vm.options.title=Android DX Compiler VM Options -android.dex.compiler.configurable.display.name=Android DX Compiler \ No newline at end of file +android.dex.compiler.configurable.display.name=Android DX Compiler +android.run.configuration.general.tab.title=General +android.run.configuration.emulator.tab.title=Emulator +android.run.configuration.logcat.tab.title=Logcat \ No newline at end of file diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationEditor.form b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationEditor.form index 28486194750c..77d1f423a16a 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationEditor.form +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationEditor.form @@ -1,160 +1,196 @@
- + - + - - - - - - - - - - - - - - - - + - - + - + + + - + + - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - + - + + - + - - - + + + + + + - + - - - - - - + - + - + - - - + + + + + + + + + + - - + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationEditor.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationEditor.java index c1ac844ecc7e..a1b6dcd8c7b8 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationEditor.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationEditor.java @@ -56,6 +56,7 @@ public class AndroidRunConfigurationEditor Date: Fri, 29 Oct 2010 18:57:01 +0400 Subject: [PATCH 2/7] clean up android run configuration UI --- .../resources/messages/AndroidBundle.properties | 14 +++++++------- .../android/run/AndroidRunConfigurationEditor.form | 6 ++++-- .../android/run/ApplicationRunParameters.form | 4 ++-- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/plugins/android/resources/messages/AndroidBundle.properties b/plugins/android/resources/messages/AndroidBundle.properties index 6f38b39de4eb..27bb17742323 100644 --- a/plugins/android/resources/messages/AndroidBundle.properties +++ b/plugins/android/resources/messages/AndroidBundle.properties @@ -85,15 +85,15 @@ android.browse.instrumentation.class.dialog.title=Select Instrumentation class instrumentation.runner.class.not.specified.error=Instrumentation runner class not specified cannot.find.testcase.error=Cannot find junit.framework.TestCase class logging.level.label=Logging level: -android.run.configuration.do.nothing.label=Do not launch Activity +android.run.configuration.do.nothing.label=&Do not launch Activity android.debug.port.busy.error=The process debug port is already in use target.package.not.specified.error=Target package is not specified in AndroidManifest.xml -android.run.configuration.network.spped.label=Network Speed: -android.run.configuration.network.latency.label=Network Latency: -android.run.configuration.wipe.user.data.label=Wipe user data -android.run.configuration.disable.boot.animation.label=Disable boot animation -android.run.configuration.command.line.label=Additional command line options -android.run.configuration.logcat.skip.content.label=Clear log before launch +android.run.configuration.network.spped.label=&Network Speed: +android.run.configuration.network.latency.label=N&etwork Latency: +android.run.configuration.wipe.user.data.label=&Wipe user data +android.run.configuration.disable.boot.animation.label=Disable &boot animation +android.run.configuration.command.line.label=Additional &command line options +android.run.configuration.logcat.skip.content.label=&Clear log before launch android.avd.error.title=AVD error cant.load.avds.error.prefix=Cannot reload AVD list: android.platform.label=Android platform: diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationEditor.form b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationEditor.form index 77d1f423a16a..0be0894ddcb9 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationEditor.form +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunConfigurationEditor.form @@ -57,7 +57,7 @@ - + @@ -66,7 +66,7 @@ - + @@ -109,6 +109,7 @@ + @@ -130,6 +131,7 @@ + diff --git a/plugins/android/src/org/jetbrains/android/run/ApplicationRunParameters.form b/plugins/android/src/org/jetbrains/android/run/ApplicationRunParameters.form index d1e965164c79..757f022289bb 100644 --- a/plugins/android/src/org/jetbrains/android/run/ApplicationRunParameters.form +++ b/plugins/android/src/org/jetbrains/android/run/ApplicationRunParameters.form @@ -19,7 +19,7 @@ - + @@ -27,7 +27,7 @@ - + From 1f878ab4193690bb40444115ea7ba04162e30b67 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 29 Oct 2010 23:12:15 +0400 Subject: [PATCH 3/7] IDEA-56580 option to set the path of the apk --- .../messages/AndroidBundle.properties | 3 +- .../compiler/AndroidPackagingCompiler.java | 15 ++++-- .../jetbrains/android/facet/AndroidFacet.java | 40 ++++++++++++---- .../facet/AndroidFacetConfiguration.java | 2 + .../android/facet/AndroidFacetEditorTab.form | 26 +++++++--- .../android/facet/AndroidFacetEditorTab.java | 48 +++++++++++++++++++ .../android/maven/AndroidMavenProvider.java | 4 ++ .../maven/AndroidMavenProviderImpl.java | 11 +++++ .../android/run/AndroidRunningState.java | 12 +---- 9 files changed, 129 insertions(+), 32 deletions(-) diff --git a/plugins/android/resources/messages/AndroidBundle.properties b/plugins/android/resources/messages/AndroidBundle.properties index 27bb17742323..08f5b6284591 100644 --- a/plugins/android/resources/messages/AndroidBundle.properties +++ b/plugins/android/resources/messages/AndroidBundle.properties @@ -210,4 +210,5 @@ android.dex.compiler.vm.options.title=Android DX Compiler VM Options android.dex.compiler.configurable.display.name=Android DX Compiler android.run.configuration.general.tab.title=General android.run.configuration.emulator.tab.title=Emulator -android.run.configuration.logcat.tab.title=Logcat \ No newline at end of file +android.run.configuration.logcat.tab.title=Logcat +android.facet.settings.apk.path.label=APK path: \ No newline at end of file diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java index d9e63ab2d994..dd54fb126649 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidPackagingCompiler.java @@ -100,11 +100,11 @@ public class AndroidPackagingCompiler implements PackagingCompiler { if (outputDir != null) { VirtualFile[] externalJars = getExternalJars(module, configuration); String resPackage = AndroidResourcesPackagingCompiler.getOutputPath(module, outputDir); - String outputPath = new File(outputDir.getPath(), module.getName() + ".apk").getPath(); + String outputPath = facet.getApkPath(); String classesDexPath = new File(outputDir.getPath(), AndroidUtils.CLASSES_FILE_NAME).getPath(); IAndroidTarget target = configuration.getAndroidTarget(); String sdkPath = configuration.getSdkPath(); - if (target != null && sdkPath != null) { + if (target != null && sdkPath != null && outputPath != null) { AptPackagingItem item = new AptPackagingItem(sdkPath, manifestFile, resPackage, outputPath, configuration.GENERATE_UNSIGNED_APK); item.setNativeLibsFolders(collectNativeLibsFolders(facet)); @@ -271,7 +271,7 @@ public class AndroidPackagingCompiler implements PackagingCompiler { @Nullable public ValidityState getValidityState() { - return new MyValidityState(myManifestFile, myResPackagePath, myClassesDexPath, myGenerateUnsignedApk, mySourceRoots, + return new MyValidityState(myManifestFile, myResPackagePath, myClassesDexPath, myFinalPath, myGenerateUnsignedApk, mySourceRoots, myExternalLibraries, myNativeLibsFolders); } @@ -282,6 +282,7 @@ public class AndroidPackagingCompiler implements PackagingCompiler { private static class MyValidityState implements ValidityState { private final Map myResourceTimestamps = new HashMap(); + private final String myApkPath; private final boolean myGenerateUnsignedApk; MyValidityState(DataInput is) throws IOException { @@ -292,11 +293,13 @@ public class AndroidPackagingCompiler implements PackagingCompiler { myResourceTimestamps.put(key, value); } myGenerateUnsignedApk = is.readBoolean(); + myApkPath = is.readUTF(); } MyValidityState(VirtualFile manifestFile, String resPackagePath, String classesDexPath, + String apkPath, boolean generateUnsignedApk, VirtualFile[] sourceRoots, VirtualFile[] externalLibs, @@ -304,6 +307,7 @@ public class AndroidPackagingCompiler implements PackagingCompiler { myResourceTimestamps.put(manifestFile.getPath(), manifestFile.getTimeStamp()); myResourceTimestamps.put(FileUtil.toSystemIndependentName(resPackagePath), new File(resPackagePath).lastModified()); myResourceTimestamps.put(FileUtil.toSystemIndependentName(classesDexPath), new File(classesDexPath).lastModified()); + myApkPath = apkPath; myGenerateUnsignedApk = generateUnsignedApk; for (VirtualFile sourceRoot : sourceRoots) { myResourceTimestamps.put(sourceRoot.getPath(), sourceRoot.getTimeStamp()); @@ -328,7 +332,9 @@ public class AndroidPackagingCompiler implements PackagingCompiler { return false; } MyValidityState mvs = (MyValidityState)otherState; - return mvs.myGenerateUnsignedApk == myGenerateUnsignedApk && mvs.myResourceTimestamps.equals(myResourceTimestamps); + return mvs.myGenerateUnsignedApk == myGenerateUnsignedApk && + mvs.myResourceTimestamps.equals(myResourceTimestamps) && + mvs.myApkPath.equals(myApkPath); } @Override @@ -339,6 +345,7 @@ public class AndroidPackagingCompiler implements PackagingCompiler { out.writeLong(entry.getValue()); } out.writeBoolean(myGenerateUnsignedApk); + out.writeUTF(myApkPath); } } } diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java index 5c9520cd4884..9465087ce6e5 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacet.java @@ -36,10 +36,7 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.DependencyScope; -import com.intellij.openapi.roots.LibraryOrderEntry; -import com.intellij.openapi.roots.ModifiableRootModel; -import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.*; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Comparing; @@ -103,6 +100,17 @@ public class AndroidFacet extends Facet { configuration.setFacet(this); } + @Nullable + public static String getOutputPackage(@NotNull Module module) { + VirtualFile compilerOutput = CompilerModuleExtension.getInstance(module).getCompilerOutputPath(); + if (compilerOutput == null) return null; + return new File(compilerOutput.getPath(), getApkName(module)).getPath(); + } + + public static String getApkName(Module module) { + return module.getName() + ".apk"; + } + public void androidPlatformChanged() { myAvdManager = null; myLocalResourceManager = null; @@ -519,11 +527,7 @@ public class AndroidFacet extends Facet { public String getAptGenSourceRootPath() { String path = getConfiguration().GEN_FOLDER_RELATIVE_PATH_APT; if (path.length() == 0) return null; - String moduleFilePath = getModule().getModuleFilePath(); - String moduleDirPath = new File(moduleFilePath).getParent(); - if (moduleDirPath != null) { - moduleDirPath = FileUtil.toSystemIndependentName(moduleDirPath); - } + String moduleDirPath = getModuleDirPath(); return moduleDirPath != null ? moduleDirPath + path : null; } @@ -532,11 +536,27 @@ public class AndroidFacet extends Facet { public String getAidlGenSourceRootPath() { String path = getConfiguration().GEN_FOLDER_RELATIVE_PATH_AIDL; if (path.length() == 0) return null; + String moduleDirPath = getModuleDirPath(); + return moduleDirPath != null ? moduleDirPath + path : null; + } + + @Nullable + private String getModuleDirPath() { String moduleFilePath = getModule().getModuleFilePath(); String moduleDirPath = new File(moduleFilePath).getParent(); if (moduleDirPath != null) { moduleDirPath = FileUtil.toSystemIndependentName(moduleDirPath); } - return moduleDirPath != null ? moduleDirPath + path : null; + return moduleDirPath; + } + + @Nullable + public String getApkPath() { + String path = getConfiguration().APK_PATH; + if (path.length() == 0) { + return getOutputPackage(getModule()); + } + String moduleDirPath = getModuleDirPath(); + return moduleDirPath != null ? FileUtil.toSystemDependentName(moduleDirPath + path) : null; } } diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetConfiguration.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetConfiguration.java index 5b6c16f2db52..2127535251f6 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetConfiguration.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetConfiguration.java @@ -57,6 +57,8 @@ public class AndroidFacetConfiguration implements FacetConfiguration { public boolean USE_CUSTOM_APK_RESOURCE_FOLDER = false; public String CUSTOM_APK_RESOURCE_FOLDER = ""; + public String APK_PATH = ""; + public boolean ADD_ANDROID_LIBRARY = true; public boolean LIBRARY_PROJECT = false; diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.form b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.form index 2e002270527d..752b7b799c18 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.form +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.form @@ -3,7 +3,7 @@ - + @@ -61,7 +61,7 @@ - + @@ -177,7 +177,7 @@ - + @@ -256,7 +256,7 @@ - + @@ -282,18 +282,32 @@ - + - + + + + + + + + + + + + + + + diff --git a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java index b8b69ad35f72..c551e8621b47 100644 --- a/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java +++ b/plugins/android/src/org/jetbrains/android/facet/AndroidFacetEditorTab.java @@ -36,6 +36,7 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.CollectionListModel; +import com.intellij.ui.ComboboxWithBrowseButton; import com.intellij.ui.components.JBList; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.HashSet; @@ -96,6 +97,8 @@ public class AndroidFacetEditorTab extends FacetEditorTab { private JPanel myResOverlayPanel; private JButton myRemoveResOverlayButton; private JCheckBox myGenerateUnsignedApk; + private ComboboxWithBrowseButton myApkPathCombo; + private JLabel myApkPathLabel; public AndroidFacetEditorTab(FacetEditorContext context, AndroidFacetConfiguration androidFacetConfiguration) { final Project project = context.getProject(); @@ -226,6 +229,35 @@ public class AndroidFacetEditorTab extends FacetEditorTab { myResOverlayList.setModel(new CollectionListModel(newItems)); } }); + + myApkPathLabel.setLabelFor(myApkPathCombo); + myApkPathCombo.getComboBox().setEditable(true); + myApkPathCombo.getComboBox().setModel(new DefaultComboBoxModel(getDefaultApks(module))); + myApkPathCombo.addBrowseFolderListener(project, new FileChooserDescriptor(true, false, false, false, false, false) { + @Override + public boolean isFileVisible(VirtualFile file, boolean showHiddenFiles) { + if (!super.isFileVisible(file, showHiddenFiles)) { + return false; + } + return file.isDirectory() || "apk".equals(file.getExtension()); + } + }); + } + + private static String[] getDefaultApks(@NotNull Module module) { + List result = new ArrayList(); + String path = AndroidFacet.getOutputPackage(module); + if (path != null) { + result.add(path); + } + AndroidMavenProvider mavenProvider = AndroidMavenUtil.getMavenProvider(); + if (mavenProvider != null && mavenProvider.isMavenizedModule(module)) { + String buildDirectory = mavenProvider.getBuildDirectory(module); + if (buildDirectory != null) { + result.add(FileUtil.toSystemDependentName(buildDirectory + '/' + AndroidFacet.getApkName(module))); + } + } + return result.toArray(new String[result.size()]); } private boolean isUnderModuleDir(VirtualFile vFile) { @@ -278,6 +310,10 @@ public class AndroidFacetEditorTab extends FacetEditorTab { return true; } + if (checkRelativePath(myConfiguration.APK_PATH, (String)myApkPathCombo.getComboBox().getEditor().getItem())) { + return true; + } + if (myGenerateRJavaWhenChanged.isSelected() != myConfiguration.REGENERATE_R_JAVA) { return true; } @@ -414,6 +450,14 @@ public class AndroidFacetEditorTab extends FacetEditorTab { } myConfiguration.ASSETS_FOLDER_RELATIVE_PATH = '/' + getAndCheckRelativePath(absAssetsPath, false); + String absApkPath = (String)myApkPathCombo.getComboBox().getEditor().getItem(); + if (absResPath.length() == 0) { + myConfiguration.APK_PATH = ""; + } + else { + myConfiguration.APK_PATH = '/' + getAndCheckRelativePath(absApkPath, false); + } + String absLibsPath = myNativeLibsFolder.getText().trim(); if (absLibsPath.length() == 0) { throw new ConfigurationException("Native libs folder not specified"); @@ -606,6 +650,10 @@ public class AndroidFacetEditorTab extends FacetEditorTab { myCustomAptSourceDirField.setText(aptSourceAbsPath != null ? aptSourceAbsPath : ""); myCustomAptSourceDirField.setEnabled(configuration.USE_CUSTOM_APK_RESOURCE_FOLDER); + String apkPath = configuration.APK_PATH; + String apkAbsPath = apkPath.length() > 0 ? toAbsolutePath(apkPath) : ""; + myApkPathCombo.getComboBox().getEditor().setItem(apkAbsPath != null ? apkAbsPath : ""); + boolean mavenizedModule = AndroidMavenUtil.isMavenizedModule(myContext.getModule()); myCopyResourcesFromArtifacts.setVisible(mavenizedModule); myCopyResourcesFromArtifacts.setSelected(myConfiguration.COPY_RESOURCES_FROM_ARTIFACTS); diff --git a/plugins/android/src/org/jetbrains/android/maven/AndroidMavenProvider.java b/plugins/android/src/org/jetbrains/android/maven/AndroidMavenProvider.java index 27e198bcabdb..ad513b666fc1 100644 --- a/plugins/android/src/org/jetbrains/android/maven/AndroidMavenProvider.java +++ b/plugins/android/src/org/jetbrains/android/maven/AndroidMavenProvider.java @@ -19,6 +19,7 @@ import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.module.Module; import org.jetbrains.android.facet.AndroidFacetConfiguration; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.List; @@ -34,5 +35,8 @@ public interface AndroidMavenProvider { @NotNull List getMavenDependencyArtifactFiles(@NotNull Module module); + @Nullable + String getBuildDirectory(@NotNull Module module); + void setPathsToDefault(@NotNull Module module, AndroidFacetConfiguration facetConfiguration); } diff --git a/plugins/android/src/org/jetbrains/android/maven/AndroidMavenProviderImpl.java b/plugins/android/src/org/jetbrains/android/maven/AndroidMavenProviderImpl.java index 5e93aae716eb..52047edf4d53 100644 --- a/plugins/android/src/org/jetbrains/android/maven/AndroidMavenProviderImpl.java +++ b/plugins/android/src/org/jetbrains/android/maven/AndroidMavenProviderImpl.java @@ -21,6 +21,7 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VfsUtil; import org.jetbrains.android.facet.AndroidFacetConfiguration; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.model.MavenArtifact; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; @@ -87,6 +88,16 @@ public class AndroidMavenProviderImpl implements AndroidMavenProvider { return result; } + @Nullable + @Override + public String getBuildDirectory(@NotNull Module module) { + MavenProject mavenProject = MavenProjectsManager.getInstance(module.getProject()).findProject(module); + if (mavenProject != null) { + return mavenProject.getBuildDirectory(); + } + return null; + } + @Override public void setPathsToDefault(@NotNull Module module, AndroidFacetConfiguration facetConfiguration) { MavenProject mavenProject = MavenProjectsManager.getInstance(module.getProject()).findProject(module); diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java index 5d512472934a..156f376d0a7c 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java @@ -41,11 +41,9 @@ import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.CompilerModuleExtension; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Computable; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; import com.intellij.xdebugger.DefaultDebugProcessHandler; import org.jetbrains.android.ddms.AdbManager; @@ -58,7 +56,6 @@ import org.jetbrains.android.util.AndroidUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.File; import java.io.IOException; import java.util.Map; import java.util.regex.Matcher; @@ -171,13 +168,6 @@ public abstract class AndroidRunningState implements RunProfileState, AndroidDeb return myEnv.getConfigurationSettings(); } - @Nullable - public static String getOutputPackage(@NotNull Module module) { - VirtualFile compilerOutput = CompilerModuleExtension.getInstance(module).getCompilerOutputPath(); - if (compilerOutput == null) return null; - return new File(compilerOutput.getPath(), module.getName() + ".apk").getPath(); - } - public boolean isStopped() { return myStopped; } @@ -565,7 +555,7 @@ public abstract class AndroidRunningState implements RunProfileState, AndroidDeb private boolean uploadAndInstall(@NotNull IDevice device, @NotNull String packageName, @NotNull Module module) throws IOException { String remotePath = "/data/local/tmp/" + packageName; - String localPath = getOutputPackage(module); + String localPath = myFacet.getApkPath(); if (!uploadApp(device, remotePath, localPath)) return false; if (!installApp(device, remotePath, packageName)) return false; return true; From 9c27276ab0428506cf4309c9a0761c9c62c9386a Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 29 Oct 2010 23:21:15 +0400 Subject: [PATCH 4/7] import maven-default apk path --- .../jetbrains/android/maven/AndroidMavenProviderImpl.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/android/src/org/jetbrains/android/maven/AndroidMavenProviderImpl.java b/plugins/android/src/org/jetbrains/android/maven/AndroidMavenProviderImpl.java index 52047edf4d53..808a5fc28100 100644 --- a/plugins/android/src/org/jetbrains/android/maven/AndroidMavenProviderImpl.java +++ b/plugins/android/src/org/jetbrains/android/maven/AndroidMavenProviderImpl.java @@ -19,6 +19,7 @@ import com.android.sdklib.SdkConstants; import com.intellij.openapi.module.Module; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VfsUtil; +import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AndroidFacetConfiguration; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -47,6 +48,13 @@ public class AndroidMavenProviderImpl implements AndroidMavenProvider { configuration.GEN_FOLDER_RELATIVE_PATH_AIDL = '/' + genRelativePath + "/aidl"; } } + + String buildDirectory = FileUtil.toSystemIndependentName(mavenProject.getBuildDirectory()); + + if (VfsUtil.isAncestor(new File(moduleDirPath), new File(buildDirectory), true)) { + String buildDirRelPath = FileUtil.getRelativePath(moduleDirPath, buildDirectory, '/'); + configuration.APK_PATH = '/' + buildDirRelPath + '/' + AndroidFacet.getApkName(module); + } } public static void configureAaptCompilation(MavenProject mavenProject, From 8577d8a9f501571d299433691a2035d7cb6d4add Mon Sep 17 00:00:00 2001 From: Gregory Shrago Date: Fri, 29 Oct 2010 20:12:27 +0400 Subject: [PATCH 5/7] lightweight popup in cell editor fix --- .../src/com/intellij/ui/table/JBTable.java | 44 ++++++++++++------- .../openapi/wm/impl/FocusManagerImpl.java | 8 ++++ 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/table/JBTable.java b/platform/platform-api/src/com/intellij/ui/table/JBTable.java index 2bdee2315dfe..bda2de982314 100644 --- a/platform/platform-api/src/com/intellij/ui/table/JBTable.java +++ b/platform/platform-api/src/com/intellij/ui/table/JBTable.java @@ -17,6 +17,7 @@ package com.intellij.ui.table; import com.intellij.Patches; import com.intellij.ide.ui.UISettings; +import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.ui.ComponentWithExpandableItems; import com.intellij.ui.ExpandableItemsHandler; import com.intellij.ui.ExpandableItemsHandlerFactory; @@ -203,7 +204,7 @@ public class JBTable extends JTable implements ComponentWithEmptyText, Component if (myEditorRemover == null) { final KeyboardFocusManager keyboardFocusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); - myEditorRemover = new MyCellEditorRemover(keyboardFocusManager); + myEditorRemover = new MyCellEditorRemover(); //noinspection HardCodedStringLiteral keyboardFocusManager.addPropertyChangeListener("focusOwner", myEditorRemover); //noinspection HardCodedStringLiteral @@ -268,10 +269,10 @@ public class JBTable extends JTable implements ComponentWithEmptyText, Component } private final class MyCellEditorRemover implements PropertyChangeListener { - private final KeyboardFocusManager myFocusManager; + private final IdeFocusManager myFocusManager; - public MyCellEditorRemover(final KeyboardFocusManager focusManager) { - myFocusManager = focusManager; + public MyCellEditorRemover() { + myFocusManager = IdeFocusManager.findInstanceByComponent(JBTable.this); } public void propertyChange(final PropertyChangeEvent e) { @@ -279,20 +280,31 @@ public class JBTable extends JTable implements ComponentWithEmptyText, Component return; } - Component c = myFocusManager.getFocusOwner(); - while (c != null) { - if (c == JBTable.this) { - // focus remains inside the table - return; - } - else if (c instanceof Window) { - if (c == SwingUtilities.getWindowAncestor(JBTable.this)) { - getCellEditor().stopCellEditing(); + myFocusManager.doWhenFocusSettlesDown(new Runnable() { + @Override + public void run() { + if (!isEditing()) { + return; + } + Component c = myFocusManager.getFocusOwner(); + while (c != null) { + if (c instanceof JPopupMenu) { + c = ((JPopupMenu)c).getInvoker(); + } + if (c == JBTable.this) { + // focus remains inside the table + return; + } + else if (c instanceof Window) { + if (c == SwingUtilities.getWindowAncestor(JBTable.this)) { + getCellEditor().stopCellEditing(); + } + break; + } + c = c.getParent(); } - break; } - c = c.getParent(); - } + }); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/FocusManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/FocusManagerImpl.java index edee5c2db77c..c650b5a5b8ce 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/FocusManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/FocusManagerImpl.java @@ -525,6 +525,14 @@ public class FocusManagerImpl extends IdeFocusManager implements Disposable { result = isFocusBeingTransferred() ? null : KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); } + final boolean meaninglessOwner = result instanceof JFrame || result instanceof JDialog || result instanceof JWindow || result instanceof JRootPane; + if ((result == null && !isFocusBeingTransferred()) || meaninglessOwner) { + final Component permOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner(); + if (permOwner != null) { + result = permOwner; + } + } + return result; } From 5562197397433d17ea2d694f2e0beb943cf82e64 Mon Sep 17 00:00:00 2001 From: Gregory Shrago Date: Fri, 29 Oct 2010 21:45:17 +0400 Subject: [PATCH 6/7] JDBC console history horizontal scrollbar is back --- .../com/intellij/execution/console/LanguageConsoleImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java index 07032af12286..6f25972c3e5a 100644 --- a/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/console/LanguageConsoleImpl.java @@ -150,6 +150,8 @@ public class LanguageConsoleImpl implements Disposable, TypeSafeDataProvider { myPanel.removeAll(); myPanel.add(myHistoryViewer.getComponent(), BorderLayout.NORTH); myPanel.add(myConsoleEditor.getComponent(), BorderLayout.CENTER); + + myHistoryViewer.setHorizontalScrollbarVisible(false); } else { myPanel.removeAll(); @@ -164,6 +166,8 @@ public class LanguageConsoleImpl implements Disposable, TypeSafeDataProvider { if (editorWindow != null) { editorWindow.setFilePinned(virtualFile, true); } + + myHistoryViewer.setHorizontalScrollbarVisible(true); } } From 29ba1e8e4b1c8cb140adf65aae5ca02c5506537b Mon Sep 17 00:00:00 2001 From: Gregory Shrago Date: Fri, 29 Oct 2010 23:55:29 +0400 Subject: [PATCH 7/7] date/time/text/lob/clob editors --- .../src/com/intellij/util/ui/SelectDateDialog.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/platform/platform-api/src/com/intellij/util/ui/SelectDateDialog.java b/platform/platform-api/src/com/intellij/util/ui/SelectDateDialog.java index c08b6b67bf55..eb83f0b2c690 100644 --- a/platform/platform-api/src/com/intellij/util/ui/SelectDateDialog.java +++ b/platform/platform-api/src/com/intellij/util/ui/SelectDateDialog.java @@ -20,6 +20,7 @@ import com.intellij.openapi.ui.DialogWrapper; import com.intellij.CommonBundle; import javax.swing.*; +import java.awt.*; import java.util.Date; @@ -34,6 +35,13 @@ public class SelectDateDialog extends DialogWrapper { pack(); } + public SelectDateDialog(Component component) { + super(component, true); + init(); + setTitle(CommonBundle.message("dialog.title.choose.date")); + pack(); + } + protected JComponent createCenterPanel() { return myPanel; }