diff options
Diffstat (limited to 'python/edu/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java')
-rw-r--r-- | python/edu/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/python/edu/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java b/python/edu/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java new file mode 100644 index 000000000000..451c5193645e --- /dev/null +++ b/python/edu/src/com/jetbrains/python/edu/PyCharmEduInitialConfigurator.java @@ -0,0 +1,247 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * 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.jetbrains.python.edu; + +import com.intellij.application.options.InitialConfigurationDialog; +import com.intellij.codeInsight.CodeInsightSettings; +import com.intellij.codeInsight.intention.IntentionActionBean; +import com.intellij.codeInsight.intention.IntentionManager; +import com.intellij.ide.AppLifecycleListener; +import com.intellij.ide.GeneralSettings; +import com.intellij.ide.RecentProjectsManagerBase; +import com.intellij.ide.SelectInTarget; +import com.intellij.ide.ui.UISettings; +import com.intellij.ide.util.PropertiesComponent; +import com.intellij.ide.util.TipDialog; +import com.intellij.notification.EventLog; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.editor.ex.EditorSettingsExternalizable; +import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.extensions.ExtensionsArea; +import com.intellij.openapi.fileChooser.impl.FileChooserUtil; +import com.intellij.openapi.fileTypes.FileTypeManager; +import com.intellij.openapi.keymap.Keymap; +import com.intellij.openapi.keymap.ex.KeymapManagerEx; +import com.intellij.openapi.keymap.impl.KeymapImpl; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.project.ProjectManagerAdapter; +import com.intellij.openapi.project.ex.ProjectManagerEx; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.Ref; +import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.wm.ToolWindowEP; +import com.intellij.openapi.wm.ToolWindowId; +import com.intellij.openapi.wm.WindowManager; +import com.intellij.platform.DirectoryProjectConfigurator; +import com.intellij.platform.PlatformProjectViewOpener; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.util.Alarm; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.messages.MessageBus; +import com.jetbrains.python.PythonLanguage; +import com.jetbrains.python.codeInsight.PyCodeInsightSettings; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.util.Set; + +/** + * @author traff + */ +@SuppressWarnings({"UtilityClassWithoutPrivateConstructor", "UtilityClassWithPublicConstructor"}) +public class PyCharmEduInitialConfigurator { + @NonNls private static final String DISPLAYED_PROPERTY = "PyCharm.initialConfigurationShown"; + + @NonNls private static final String CONFIGURED = "PyCharm.InitialConfiguration"; + + + public static class First { + + public First() { + patchRootAreaExtensions(); + } + } + + /** + * @noinspection UnusedParameters + */ + public PyCharmEduInitialConfigurator(MessageBus bus, + UISettings uiSettings, + CodeInsightSettings codeInsightSettings, + final PropertiesComponent propertiesComponent, + FileTypeManager fileTypeManager, + final ProjectManagerEx projectManager, + RecentProjectsManagerBase recentProjectsManager) { + if (!propertiesComponent.getBoolean(CONFIGURED, false)) { + propertiesComponent.setValue(CONFIGURED, "true"); + recentProjectsManager.loadState(new RecentProjectsManagerBase.State()); + propertiesComponent.setValue("toolwindow.stripes.buttons.info.shown", "true"); + UISettings.getInstance().HIDE_TOOL_STRIPES = false; + uiSettings.SHOW_MEMORY_INDICATOR = false; + uiSettings.SHOW_DIRECTORY_FOR_NON_UNIQUE_FILENAMES = true; + codeInsightSettings.REFORMAT_ON_PASTE = CodeInsightSettings.NO_REFORMAT; + + EditorSettingsExternalizable.getInstance().setVirtualSpace(false); + final CodeStyleSettings settings = CodeStyleSettingsManager.getInstance().getCurrentSettings(); + settings.ALIGN_MULTILINE_PARAMETERS_IN_CALLS = true; + settings.getCommonSettings(PythonLanguage.getInstance()).ALIGN_MULTILINE_PARAMETERS_IN_CALLS = true; + UISettings.getInstance().SHOW_DIRECTORY_FOR_NON_UNIQUE_FILENAMES = true; + UISettings.getInstance().SHOW_MEMORY_INDICATOR = false; + final String ignoredFilesList = fileTypeManager.getIgnoredFilesList(); + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + FileTypeManager.getInstance().setIgnoredFilesList(ignoredFilesList + ";*$py.class"); + } + }); + } + }); + PyCodeInsightSettings.getInstance().SHOW_IMPORT_POPUP = false; + } + bus.connect().subscribe(AppLifecycleListener.TOPIC, new AppLifecycleListener.Adapter() { + @Override + public void appFrameCreated(String[] commandLineArgs, @NotNull Ref<Boolean> willOpenProject) { + if (!propertiesComponent.isValueSet(DISPLAYED_PROPERTY)) { + GeneralSettings.getInstance().setShowTipsOnStartup(false); + showInitialConfigurationDialog(); + propertiesComponent.setValue(DISPLAYED_PROPERTY, "true"); + } + } + + @Override + public void appStarting(Project projectFromCommandLine) { + patchKeymap(); + } + }); + bus.connect().subscribe(ProjectManager.TOPIC, new ProjectManagerAdapter() { + @Override + public void projectOpened(final Project project) { + if (project.isDefault()) return; + if (FileChooserUtil.getLastOpenedFile(project) == null) { + FileChooserUtil.setLastOpenedFile(project, VfsUtil.getUserHomeDir()); + } + + patchProjectAreaExtensions(project); + + //StartupManager.getInstance(project).runWhenProjectIsInitialized(new DumbAwareRunnable() { + // @Override + // public void run() { + // if (project.isDisposed()) return; + // + // ToolWindowManager.getInstance(project).invokeLater(new Runnable() { + // int count = 0; + // public void run() { + // if (project.isDisposed()) return; + // if (count ++ < 3) { + // ToolWindowManager.getInstance(project).invokeLater(this); + // return; + // } + // if (!propertiesComponent.isValueSet(INIT_DB_DIALOG_DISPLAYED)) { + // ToolWindow toolWindow = DatabaseView.getDatabaseToolWindow(project); + // if (toolWindow.getType() != ToolWindowType.SLIDING) { + // toolWindow.activate(null); + // } + // propertiesComponent.setValue(INIT_DB_DIALOG_DISPLAYED, "true"); + // onFirstProjectOpened(project); + // } + // } + // }); + // } + //}); + } + }); + } + + private static void onFirstProjectOpened(@NotNull final Project project) { + // show python console + + + GeneralSettings.getInstance().setShowTipsOnStartup(true); + + // show tips once + final Alarm alarm = new Alarm(project); + alarm.addRequest(new Runnable() { + @Override + public void run() { + Disposer.dispose(alarm); + TipDialog.createForProject(project).show(); + } + }, 2000, ModalityState.NON_MODAL); + } + + private static void patchRootAreaExtensions() { + ExtensionsArea rootArea = Extensions.getArea(null); + + for (ToolWindowEP ep : Extensions.getExtensions(ToolWindowEP.EP_NAME)) { + if (ToolWindowId.FAVORITES_VIEW.equals(ep.id) || ToolWindowId.TODO_VIEW.equals(ep.id) || EventLog.LOG_TOOL_WINDOW_ID.equals(ep.id)) { + rootArea.getExtensionPoint(ToolWindowEP.EP_NAME).unregisterExtension(ep); + } + } + + for (DirectoryProjectConfigurator ep : Extensions.getExtensions(DirectoryProjectConfigurator.EP_NAME)) { + if (ep instanceof PlatformProjectViewOpener) { + rootArea.getExtensionPoint(DirectoryProjectConfigurator.EP_NAME).unregisterExtension(ep); + } + } + + for (IntentionActionBean ep : Extensions.getExtensions(IntentionManager.EP_INTENTION_ACTIONS)) { + if ("org.intellij.lang.regexp.intention.CheckRegExpIntentionAction".equals(ep.className)) { + rootArea.getExtensionPoint(IntentionManager.EP_INTENTION_ACTIONS).unregisterExtension(ep); + } + } + } + + private static void patchProjectAreaExtensions(@NotNull final Project project) { + for (SelectInTarget target : Extensions.getExtensions(SelectInTarget.EP_NAME, project)) { + if (ToolWindowId.FAVORITES_VIEW.equals(target.getToolWindowId())) { + Extensions.getArea(project).getExtensionPoint(SelectInTarget.EP_NAME).unregisterExtension(target); + } + } + } + + private static void patchKeymap() { + Set<String> droppedActions = ContainerUtil.newHashSet( + "AddToFavoritesPopup", "RemoveFromFavorites", + "DatabaseView.ImportDataSources", + "CompileDirty", "Compile", + // hidden + "AddNewFavoritesList", "EditFavorites", "RemoveFromFavorites", "RenameFavoritesList", "RemoveFavoritesList"); + KeymapManagerEx keymapManager = KeymapManagerEx.getInstanceEx(); + + + for (Keymap keymap : keymapManager.getAllKeymaps()) { + if (keymap.canModify()) continue; + + KeymapImpl keymapImpl = (KeymapImpl)keymap; + + for (String id : keymapImpl.getOwnActionIds()) { + if (droppedActions.contains(id)) keymapImpl.clearOwnActionsId(id); + } + } + } + + private static void showInitialConfigurationDialog() { + final JFrame frame = WindowManager.getInstance().findVisibleFrame(); + new InitialConfigurationDialog(frame, "Python").show(); + } +} |