Merge remote-tracking branch 'origin/master'
authorEkaterina Tuzova <Ekaterina.Tuzova@jetbrains.com>
Mon, 4 Aug 2014 11:01:20 +0000 (15:01 +0400)
committerEkaterina Tuzova <Ekaterina.Tuzova@jetbrains.com>
Mon, 4 Aug 2014 11:01:20 +0000 (15:01 +0400)
842 files changed:
build/scripts/libLicenses.gant
java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java
java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectJdksConfigurable.java
java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java
java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/artifacts/ArtifactEditorImpl.java
platform/dvcs/src/com/intellij/dvcs/ui/VcsLogAction.java
platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java
platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/ExternalSystemTestCase.java
platform/lang-api/src/com/intellij/find/FindModel.java
platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsConfigurable.form
platform/lang-impl/src/com/intellij/application/options/editor/EditorTabsConfigurable.java
platform/lang-impl/src/com/intellij/codeInsight/editorActions/IndentingBackspaceHandler.java
platform/lang-impl/src/com/intellij/execution/console/DuplexConsoleView.java
platform/lang-impl/src/com/intellij/find/impl/FindDialog.java
platform/lang-impl/src/com/intellij/find/impl/RegExHelpPopup.java
platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/DetectedRootsChooserDialog.java
platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/SuggestedChildRootInfo.java
platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/CommonContentEntriesEditor.java
platform/lang-impl/src/com/intellij/util/indexing/MapReduceIndex.java
platform/lang-impl/src/com/intellij/webcore/packaging/ManagePackagesDialog.java
platform/lang-impl/testSources/com/intellij/codeInsight/editorActions/IndentingBackspaceHandlerUncommittedDocumentTest.java
platform/lvcs-impl/src/com/intellij/history/core/Paths.java
platform/platform-api/src/com/intellij/openapi/diff/FragmentContent.java
platform/platform-api/src/com/intellij/openapi/ui/MasterDetailsComponent.java
platform/platform-api/src/com/intellij/openapi/ui/OnePixelDivider.java [new file with mode: 0644]
platform/platform-api/src/com/intellij/ui/CheckboxTreeAdapter.java [new file with mode: 0644]
platform/platform-api/src/com/intellij/ui/CheckboxTreeBase.java
platform/platform-api/src/com/intellij/ui/CheckboxTreeHelper.java [moved from platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/CheckboxTreeTable.java with 55% similarity]
platform/platform-api/src/com/intellij/ui/CheckboxTreeListener.java [new file with mode: 0644]
platform/platform-api/src/com/intellij/ui/JBSplitter.java
platform/platform-api/src/com/intellij/ui/OnePixelSplitter.java [new file with mode: 0644]
platform/platform-api/src/com/intellij/ui/tabs/TabInfo.java
platform/platform-api/src/com/intellij/ui/tabs/impl/JBEditorTabs.java
platform/platform-api/src/com/intellij/ui/tabs/impl/TabLabel.java
platform/platform-impl/src/com/intellij/openapi/diff/actions/CompareClipboardWithSelection.java
platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffSplitter.java
platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorTabbedContainer.java
platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorWindow.java
platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/text/TextEditorProvider.java
platform/platform-impl/src/com/intellij/openapi/wm/impl/IdeGlassPaneImpl.java
platform/platform-impl/src/com/intellij/ui/CheckboxTree.java
platform/platform-impl/src/com/intellij/ui/CheckboxTreeTable.java [new file with mode: 0644]
platform/platform-impl/src/com/intellij/ui/SplitterWithSecondHideable.java
platform/platform-impl/src/org/jetbrains/io/PortUnificationServerHandler.java
platform/platform-resources-en/src/messages/ApplicationBundle.properties
platform/platform-resources/src/idea/Keymap_EclipseMac.xml
platform/platform-resources/src/idea/PlatformActions.xml
platform/platform-tests/testSrc/com/intellij/history/core/PathsTest.java
platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/CompiledPattern.java
platform/usageView/src/com/intellij/usages/ChunkExtractor.java
platform/usageView/src/com/intellij/usages/UsageInfo2UsageAdapter.java
platform/util/resources/misc/registry.properties
platform/util/src/com/intellij/openapi/ui/Divider.java [new file with mode: 0644]
platform/util/src/com/intellij/openapi/ui/Splitter.java
platform/util/src/com/intellij/openapi/util/io/win32/IdeaWin32.java
platform/util/src/com/intellij/openapi/util/text/StringUtil.java
platform/util/src/com/intellij/util/Restarter.java
platform/util/testSrc/com/intellij/util/text/StringUtilTest.java
platform/vcs-api/src/com/intellij/openapi/vcs/ProjectLevelVcsManager.java
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/LocalChangeListImpl.java
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/UpdatingChangeListBuilder.java
platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsGuess.java
platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java
platform/vcs-impl/src/com/intellij/openapi/vcs/impl/VcsRootIterator.java
platform/vcs-impl/src/com/intellij/openapi/vcs/impl/projectlevelman/NewMappings.java
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/XDebugSessionImpl.java
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/actions/handlers/XDebuggerRunToCursorActionHandler.java
platform/xdebugger-impl/src/com/intellij/xdebugger/impl/breakpoints/XBreakpointManagerImpl.java
plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectorUtils.java
plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/cvsstatuses/CvsChangeProvider.java
plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/ui/experts/importToCvs/ImportTree.java
plugins/devkit/src/build/PrepareToDeployAction.java
plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java
plugins/gradle/tooling-extension-api/src/org/jetbrains/plugins/gradle/model/ProjectImportAction.java
plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/builder/WarModelBuilderImpl.groovy
plugins/svn4idea/src/org/jetbrains/idea/svn/StatusWalkerPartner.java
plugins/svn4idea/src/org/jetbrains/idea/svn/actions/SvnExcludingIgnoredOperation.java
plugins/terminal/lib/jediterm-pty-2.0.jar
python/build/paths.nsi
python/build/pycharm64_community_launcher.properties [new file with mode: 0644]
python/build/pycharm_community_build.gant
python/edu/build/DMG_background.png [new file with mode: 0644]
python/edu/build/paths.nsi [new file with mode: 0644]
python/edu/build/plugin-list.txt [new file with mode: 0644]
python/edu/build/pycharm_edu_build.gant [new file with mode: 0644]
python/edu/build/pycharm_edu_launcher.properties [new file with mode: 0644]
python/edu/build/python-edu-build.iml [new file with mode: 0644]
python/edu/build/resources/PC_instCom.ico [new file with mode: 0644]
python/edu/build/resources/PC_uninstCom.ico [new file with mode: 0644]
python/edu/build/resources/headerlogo.bmp [new file with mode: 0644]
python/edu/build/resources/logo.bmp [new file with mode: 0644]
python/edu/build/resources/pycharm_inst.ico [new file with mode: 0644]
python/edu/build/resources/pycharm_uninst.ico [new file with mode: 0644]
python/edu/build/strings.nsi [new file with mode: 0644]
python/edu/main_pycharm_edu.iml [new file with mode: 0644]
python/edu/python-educational.iml [new file with mode: 0644]
python/edu/resources/ProductivityFeaturesRegistry.xml [new file with mode: 0644]
python/edu/resources/PyCharmCore.icns [new file with mode: 0644]
python/edu/resources/PyCharmCore.ico [new file with mode: 0644]
python/edu/resources/PyCharmCore128.png [new file with mode: 0644]
python/edu/resources/PyCharmCore13.png [new file with mode: 0644]
python/edu/resources/PyCharmCore16.png [new file with mode: 0644]
python/edu/resources/PyCharmCore32.png [new file with mode: 0644]
python/edu/resources/PyCharmCoreWelcomeCaption.png [new file with mode: 0644]
python/edu/resources/PyCharmCoreWelcomeScreen.png [new file with mode: 0644]
python/edu/resources/PyCharmCoreWelcomeScreen@2x.png [new file with mode: 0644]
python/edu/resources/colorSchemes/PythonDarcula.xml [new file with mode: 0644]
python/edu/resources/colorSchemes/PythonDefault.xml [new file with mode: 0644]
python/edu/resources/community_progress_tail.png [new file with mode: 0644]
python/edu/resources/developSlogan.png [new file with mode: 0644]
python/edu/resources/fileTemplates/internal/Python Script.py.ft [new file with mode: 0644]
python/edu/resources/fileTemplates/internal/Python Unit Test.py.ft [new file with mode: 0644]
python/edu/resources/fileTemplates/internal/Setup Script.py.ft [new file with mode: 0644]
python/edu/resources/icon-robots.txt [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/pyqt/tsFile.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/pyqt/tsFile@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/pyqt/uiForm.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/pyqt/uiForm@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/buildout/buildout.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/buildout/buildout@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/debug/commandLine.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/debug/commandLine@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/dotnet.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/dotnet@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/interpreterGear.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/interpreterGear@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/interpreterGear@2x_dark.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/interpreterGear_dark.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/jython.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/jython@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/nodes/cyan-dot.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/nodes/cyan-dot@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/nodes/lock.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/nodes/lock@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/nodes/red-inv-triangle.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/nodes/red-inv-triangle@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/propertyDeleter.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/propertyDeleter@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/propertyDeleter@2x_dark.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/propertyDeleter_dark.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/propertyGetter.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/propertyGetter@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/propertyGetter@2x_dark.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/propertyGetter_dark.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/propertySetter.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/propertySetter@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/propertySetter@2x_dark.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/propertySetter_dark.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/pypy.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/pypy@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/python-logo.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/python.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/python@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/pythonClosed.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/pythonClosed@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/pythonTests.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/pythonTests@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/python_24.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/python_24@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/templateRoot.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/templateRoot@2x.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/virtualenv.png [new file with mode: 0644]
python/edu/resources/icons/com/jetbrains/python/virtualenv@2x.png [new file with mode: 0644]
python/edu/resources/idea/PyCharmEduApplicationInfo.xml [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/BuildoutUnresolvedPartInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyAbstractClassInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyArgumentEqualDefaultInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyArgumentListInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyAssignmentToLoopOrWithParameterInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyAttributeOutsideInitInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyAugmentAssignmentInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyBroadExceptionInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyByteLiteralInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyCallByClassInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyCallingNonCallableInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyChainedComparisonsInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyClassHasNoInitInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyClassicStyleClassInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyComparisonWithNoneInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyCompatibilityInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyDecoratorInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyDefaultArgumentInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyDeprecatedModulesInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyDeprecationInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyDictCreationInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyDictDuplicateKeysInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyDocstringInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyDocstringTypesInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyExceptClausesOrderInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyExceptionInheritInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyFromFutureImportInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyGlobalUndefinedInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyInconsistentIndentationInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyInitNewSignatureInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyInterpreterInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyListCreationInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyMandatoryEncodingInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyMethodFirstArgAssignmentInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyMethodMayBeStaticInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyMethodOverridingInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyMethodParametersInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyMissingConstructorInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyNestedDecoratorsInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyNonAsciiCharInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyNoneFunctionAssignmentInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyOldStyleClassesInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyPackageRequirementsInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyPep8Inspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyPep8NamingInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyPropertyAccessInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyPropertyDefinitionInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyProtectedMemberInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyRaisingNewStyleClassInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyRedeclarationInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyRedundantParenthesesInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyReturnFromInitInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PySetFunctionToLiteralInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyShadowingBuiltinsInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyShadowingNamesInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PySimplifyBooleanCheckInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PySingleQuotedDocstringInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyStatementEffectInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyStringExceptionInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyStringFormatInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PySuperArgumentsInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyTrailingSemicolonInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyTupleAssignmentBalanceInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyTupleItemAssignmentInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyTypeCheckerInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyUnboundLocalVariableInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyUnnecessaryBackslashInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyUnreachableCodeInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyUnresolvedReferencesInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyUnsupportedFeaturesInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/PyUnusedLocalInspection.html [new file with mode: 0644]
python/edu/resources/inspectionDescriptions/RestRoleInspection.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ConvertFormatOperatorToMethodIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ConvertFormatOperatorToMethodIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ConvertFormatOperatorToMethodIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ConvertVariadicParamIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ConvertVariadicParamIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ConvertVariadicParamIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ImportFromToImportIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ImportFromToImportIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ImportFromToImportIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ImportToImportFromIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ImportToImportFromIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ImportToImportFromIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ImportToggleAliasIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ImportToggleAliasIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ImportToggleAliasIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyConvertLambdaToFunctionIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyConvertLambdaToFunctionIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyConvertLambdaToFunctionIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyConvertMethodToPropertyIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyConvertMethodToPropertyIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyConvertMethodToPropertyIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyConvertStaticMethodToFunctionIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyConvertStaticMethodToFunctionIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyConvertStaticMethodToFunctionIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyConvertTripleQuotedStringIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyConvertTripleQuotedStringIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyConvertTripleQuotedStringIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyDemorganIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyDemorganIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyDemorganIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyDictConstructorToLiteralFormIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyDictConstructorToLiteralFormIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyDictConstructorToLiteralFormIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyDictLiteralFormToConstructorIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyDictLiteralFormToConstructorIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyDictLiteralFormToConstructorIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyFlipComparisonIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyFlipComparisonIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyFlipComparisonIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyGenerateDocstringIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyGenerateDocstringIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyGenerateDocstringIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyJoinIfIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyJoinIfIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyJoinIfIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyNegateComparisonIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyNegateComparisonIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyNegateComparisonIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyQuotedStringIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyQuotedStringIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyQuotedStringIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PySplitIfIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PySplitIfIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PySplitIfIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyStringConcatenationToFormatIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyStringConcatenationToFormatIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyStringConcatenationToFormatIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyTransformConditionalExpressionIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyTransformConditionalExpressionIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyTransformConditionalExpressionIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyYieldFromIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyYieldFromIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/PyYieldFromIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ReplaceListComprehensionWithForIntention/after.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ReplaceListComprehensionWithForIntention/before.py.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/ReplaceListComprehensionWithForIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/SpecifyTypeInDocstringIntention/after.html.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/SpecifyTypeInDocstringIntention/before.html.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/SpecifyTypeInDocstringIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/SpecifyTypeInPy3AnnotationsIntention/after.html.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/SpecifyTypeInPy3AnnotationsIntention/before.html.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/SpecifyTypeInPy3AnnotationsIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/TypeAssertionIntention/after.html.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/TypeAssertionIntention/before.html.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/TypeAssertionIntention/description.html [new file with mode: 0644]
python/edu/resources/intentionDescriptions/WrapTransTagIntention/after.html.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/WrapTransTagIntention/before.html.template [new file with mode: 0644]
python/edu/resources/intentionDescriptions/WrapTransTagIntention/description.html [new file with mode: 0644]
python/edu/resources/liveTemplates/Python.xml [new file with mode: 0644]
python/edu/resources/pycharm_core_about.png [new file with mode: 0644]
python/edu/resources/pycharm_core_about@2x.png [new file with mode: 0644]
python/edu/resources/pycharm_core_logo.png [new file with mode: 0644]
python/edu/resources/pycharm_core_logo@2x.png [new file with mode: 0644]
python/edu/resources/tips/AdaptiveWelcome.html [new file with mode: 0644]
python/edu/resources/tips/AnnotationsAndDiffs.html [new file with mode: 0644]
python/edu/resources/tips/BreakpointSpeedmenu.html [new file with mode: 0644]
python/edu/resources/tips/BuiltInServer.html [new file with mode: 0644]
python/edu/resources/tips/CamelHumpsInCodeCompletion.html [new file with mode: 0644]
python/edu/resources/tips/CamelPrefixesInNavigationPopups.html [new file with mode: 0644]
python/edu/resources/tips/CancelByControlArrows.html [new file with mode: 0644]
python/edu/resources/tips/ChangeSorting.html [new file with mode: 0644]
python/edu/resources/tips/ChangesView.html [new file with mode: 0644]
python/edu/resources/tips/CheckRegExp.html [new file with mode: 0644]
python/edu/resources/tips/ClassNameCompletion.html [new file with mode: 0644]
python/edu/resources/tips/ClipboardStack.html [new file with mode: 0644]
python/edu/resources/tips/CloseOthers.html [new file with mode: 0644]
python/edu/resources/tips/CodeCompletion.html [new file with mode: 0644]
python/edu/resources/tips/CodeCompletionInSearch.html [new file with mode: 0644]
python/edu/resources/tips/CodeCompletionMiddle.html [new file with mode: 0644]
python/edu/resources/tips/CodeCompletionNoShift.html [new file with mode: 0644]
python/edu/resources/tips/ColorEditingInCss.html [new file with mode: 0644]
python/edu/resources/tips/ColumnSelection.html [new file with mode: 0644]
python/edu/resources/tips/Comment.html [new file with mode: 0644]
python/edu/resources/tips/CommitCtrlK.html [new file with mode: 0644]
python/edu/resources/tips/CompletionInHTML.html [new file with mode: 0644]
python/edu/resources/tips/ConfiguringTerminal.html [new file with mode: 0644]
python/edu/resources/tips/Consoles.html [new file with mode: 0644]
python/edu/resources/tips/ConsolesCodeCompletion.html [new file with mode: 0644]
python/edu/resources/tips/ConsolesHistory.html [new file with mode: 0644]
python/edu/resources/tips/CopyWithNoSelection.html [new file with mode: 0644]
python/edu/resources/tips/CtrlD.html [new file with mode: 0644]
python/edu/resources/tips/CtrlDotInLookups.html [new file with mode: 0644]
python/edu/resources/tips/CtrlShiftI.html [new file with mode: 0644]
python/edu/resources/tips/CtrlShiftIForLookup.html [new file with mode: 0644]
python/edu/resources/tips/CtrlW.html [new file with mode: 0644]
python/edu/resources/tips/DirDiff.html [new file with mode: 0644]
python/edu/resources/tips/DotEtcInLookups.html [new file with mode: 0644]
python/edu/resources/tips/DragToOpen.html [new file with mode: 0644]
python/edu/resources/tips/EditRegExp.html [new file with mode: 0644]
python/edu/resources/tips/Emmet.html [new file with mode: 0644]
python/edu/resources/tips/EnterDirectoryInGotoFile.html [new file with mode: 0644]
python/edu/resources/tips/Escape.html [new file with mode: 0644]
python/edu/resources/tips/EvaluateExpressionInEditor.html [new file with mode: 0644]
python/edu/resources/tips/ExtractVariable.html [new file with mode: 0644]
python/edu/resources/tips/FileStructurePopup.html [new file with mode: 0644]
python/edu/resources/tips/FindReplaceToggle.html [new file with mode: 0644]
python/edu/resources/tips/FindUsages.html [new file with mode: 0644]
python/edu/resources/tips/GoToAction.html [new file with mode: 0644]
python/edu/resources/tips/GoToClass.html [new file with mode: 0644]
python/edu/resources/tips/GoToDeclaration.html [new file with mode: 0644]
python/edu/resources/tips/GoToInspection.html [new file with mode: 0644]
python/edu/resources/tips/GoToSymbol.html [new file with mode: 0644]
python/edu/resources/tips/GotoLineInFile.html [new file with mode: 0644]
python/edu/resources/tips/HierarchyBrowser.html [new file with mode: 0644]
python/edu/resources/tips/HighlightUsagesInFile.html [new file with mode: 0644]
python/edu/resources/tips/HorizontalScrolling.html [new file with mode: 0644]
python/edu/resources/tips/ImageFileCompletion.html [new file with mode: 0644]
python/edu/resources/tips/ImagesLookup.html [new file with mode: 0644]
python/edu/resources/tips/Interpreter.html [new file with mode: 0644]
python/edu/resources/tips/IssueNavigation.html [new file with mode: 0644]
python/edu/resources/tips/JoinLines.html [new file with mode: 0644]
python/edu/resources/tips/JumpToLastEdit.html [new file with mode: 0644]
python/edu/resources/tips/LaunchConsole.html [new file with mode: 0644]
python/edu/resources/tips/LineEndings.html [new file with mode: 0644]
python/edu/resources/tips/LineEndingsFolder.html [new file with mode: 0644]
python/edu/resources/tips/LiveTemplates.html [new file with mode: 0644]
python/edu/resources/tips/LiveTemplatesDjango.html [new file with mode: 0644]
python/edu/resources/tips/LiveTemplatesRestore.html [new file with mode: 0755]
python/edu/resources/tips/LocalVCS.html [new file with mode: 0644]
python/edu/resources/tips/Managepy.html [new file with mode: 0644]
python/edu/resources/tips/MenuItemsDescriptions.html [new file with mode: 0644]
python/edu/resources/tips/MethodSeparators.html [new file with mode: 0644]
python/edu/resources/tips/MethodUpDown.html [new file with mode: 0644]
python/edu/resources/tips/MoveToChangelist.html [new file with mode: 0644]
python/edu/resources/tips/MoveUpDown.html [new file with mode: 0644]
python/edu/resources/tips/Multicursor.html [new file with mode: 0755]
python/edu/resources/tips/Multicursor1.html [new file with mode: 0755]
python/edu/resources/tips/MultipleProjects.html [new file with mode: 0644]
python/edu/resources/tips/NavBar.html [new file with mode: 0644]
python/edu/resources/tips/NavigateToFilePath.html [new file with mode: 0644]
python/edu/resources/tips/OverrideImplementMethods.html [new file with mode: 0644]
python/edu/resources/tips/ParameterInfo.html [new file with mode: 0644]
python/edu/resources/tips/PreviewTODO.html [new file with mode: 0644]
python/edu/resources/tips/PyColorFiles.html [new file with mode: 0644]
python/edu/resources/tips/QuickDocInSuggestionList.html [new file with mode: 0755]
python/edu/resources/tips/QuickDocOnMouseMove.html [new file with mode: 0755]
python/edu/resources/tips/QuickFixRightArrow.html [new file with mode: 0644]
python/edu/resources/tips/QuickJavaDoc.html [new file with mode: 0644]
python/edu/resources/tips/QuickJavaDocInLookups.html [new file with mode: 0644]
python/edu/resources/tips/QuickSwitchScheme.html [new file with mode: 0644]
python/edu/resources/tips/RecentChanges.html [new file with mode: 0644]
python/edu/resources/tips/RecentFiles.html [new file with mode: 0644]
python/edu/resources/tips/RecentSearch.html [new file with mode: 0644]
python/edu/resources/tips/RefactorThis.html [new file with mode: 0644]
python/edu/resources/tips/RemoteInterpreter.html [new file with mode: 0644]
python/edu/resources/tips/Rename.html [new file with mode: 0644]
python/edu/resources/tips/RenameCssSelector.html [new file with mode: 0644]
python/edu/resources/tips/Reopen.html [new file with mode: 0644]
python/edu/resources/tips/RunConfigFolders.html [new file with mode: 0644]
python/edu/resources/tips/ScopesInTODO.html [new file with mode: 0644]
python/edu/resources/tips/SearchEverywhere.html [new file with mode: 0644]
python/edu/resources/tips/SearchInSettings.html [new file with mode: 0644]
python/edu/resources/tips/SelectIn.html [new file with mode: 0644]
python/edu/resources/tips/SelectRunDebugConfiguration.html [new file with mode: 0644]
python/edu/resources/tips/SelectTasks.html [new file with mode: 0644]
python/edu/resources/tips/ShowAppliedStyles.html [new file with mode: 0644]
python/edu/resources/tips/ShowHideSideBars.html [new file with mode: 0644]
python/edu/resources/tips/ShowUsages.html [new file with mode: 0644]
python/edu/resources/tips/SpeedSearch.html [new file with mode: 0644]
python/edu/resources/tips/SpeedSearchinLiveTemplates.html [new file with mode: 0644]
python/edu/resources/tips/Spellchecker.html [new file with mode: 0644]
python/edu/resources/tips/SpellcheckerDictionaries.html [new file with mode: 0644]
python/edu/resources/tips/Surround.html [new file with mode: 0644]
python/edu/resources/tips/Switcher.html [new file with mode: 0644]
python/edu/resources/tips/TabInEditorClose.html [new file with mode: 0644]
python/edu/resources/tips/TabInLookups.html [new file with mode: 0644]
python/edu/resources/tips/TagNameCompletion.html [new file with mode: 0644]
python/edu/resources/tips/Templates.html [new file with mode: 0644]
python/edu/resources/tips/Terminal.html [new file with mode: 0644]
python/edu/resources/tips/TerminalOpen.html [new file with mode: 0755]
python/edu/resources/tips/ToolWindowsQuickAccess.html [new file with mode: 0644]
python/edu/resources/tips/VcsQuickList.html [new file with mode: 0644]
python/edu/resources/tips/Welcome.html [new file with mode: 0644]
python/edu/resources/tips/WideScreen.html [new file with mode: 0644]
python/edu/resources/tips/WildcardsInNavigationPopups.html [new file with mode: 0644]
python/edu/resources/tips/WordCompletion.html [new file with mode: 0644]
python/edu/resources/tips/css/tips.css [new file with mode: 0644]
python/edu/resources/tips/css/tips_darcula.css [new file with mode: 0644]
python/edu/resources/tips/images/CodeCompletionInSearch.png [new file with mode: 0644]
python/edu/resources/tips/images/CodeCompletionInSearch@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/CodeCompletionInSearch@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/CodeCompletionInSearch_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/RunConfigFolder.png [new file with mode: 0644]
python/edu/resources/tips/images/RunConfigFolder@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/RunConfigFolder@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/RunConfigFolder_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/SpeedSearchInLiveTemplates.png [new file with mode: 0644]
python/edu/resources/tips/images/SpeedSearchInLiveTemplates@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/SpeedSearchInLiveTemplates@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/SpeedSearchInLiveTemplates_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/add_remote_interpreter.png [new file with mode: 0644]
python/edu/resources/tips/images/add_remote_interpreter@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/add_remote_interpreter@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/add_remote_interpreter_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/annotationShowDiff.png [new file with mode: 0644]
python/edu/resources/tips/images/annotationShowDiff@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/annotationShowDiff@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/annotationShowDiff_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/breakpoint_speedmenu.png [new file with mode: 0644]
python/edu/resources/tips/images/breakpoint_speedmenu@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/breakpoint_speedmenu@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/breakpoint_speedmenu@_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/browse_remote_hosts.png [new file with mode: 0644]
python/edu/resources/tips/images/builtInServer.png [new file with mode: 0644]
python/edu/resources/tips/images/builtInServer@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/builtInServer@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/builtInServer@_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/bullet.png [new file with mode: 0644]
python/edu/resources/tips/images/camel_completion.png [new file with mode: 0644]
python/edu/resources/tips/images/camel_completion@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/camel_completion@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/camel_completion_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/camel_goto.png [new file with mode: 0644]
python/edu/resources/tips/images/camel_goto@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/camel_goto@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/camel_goto_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/changeLookupSorting.png [new file with mode: 0644]
python/edu/resources/tips/images/changeLookupSorting@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/changeLookupSorting@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/changeLookupSorting_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/checkRegExp.png [new file with mode: 0644]
python/edu/resources/tips/images/checkRegExp@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/checkRegExp@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/checkRegExp_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/class_name_completion.png [new file with mode: 0644]
python/edu/resources/tips/images/class_name_completion@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/class_name_completion@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/class_name_completion_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/close1.png [new file with mode: 0644]
python/edu/resources/tips/images/close_others.png [new file with mode: 0644]
python/edu/resources/tips/images/close_others@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/close_others@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/close_others_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/code_completion.png [new file with mode: 0644]
python/edu/resources/tips/images/code_completion@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/code_completion@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/code_completion_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/code_completion_middle.png [new file with mode: 0644]
python/edu/resources/tips/images/code_completion_middle@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/code_completion_middle@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/code_completion_middle_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/code_completion_no_shift.png [new file with mode: 0644]
python/edu/resources/tips/images/code_completion_no_shift@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/code_completion_no_shift@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/code_completion_no_shift_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/coloredFiles.png [new file with mode: 0644]
python/edu/resources/tips/images/coloredFiles@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/coloredFiles@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/coloredFiles_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/columnSelection.png [new file with mode: 0644]
python/edu/resources/tips/images/columnSelection@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/columnSelection@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/columnSelection_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/completion_in_html.png [new file with mode: 0644]
python/edu/resources/tips/images/completion_in_html2.png [new file with mode: 0644]
python/edu/resources/tips/images/completion_in_html2@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/completion_in_html2@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/completion_in_html2_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/completion_in_html@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/completion_in_html@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/completion_in_html_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/cssColor.png [new file with mode: 0644]
python/edu/resources/tips/images/cssColor@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/cssColor@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/cssColor_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/ctrl_click.png [new file with mode: 0644]
python/edu/resources/tips/images/ctrl_click@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/ctrl_click@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/ctrl_click_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/ctrl_shift_i.png [new file with mode: 0644]
python/edu/resources/tips/images/ctrl_shift_i@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/ctrl_shift_i@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/ctrl_shift_i_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/ctrl_shift_in_lookup.png [new file with mode: 0644]
python/edu/resources/tips/images/ctrl_shift_in_lookup@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/ctrl_shift_in_lookup@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/ctrl_shift_in_lookup_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/default_template_language.png [new file with mode: 0644]
python/edu/resources/tips/images/default_template_language@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/default_template_language@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/default_template_language_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/deployment.png [new file with mode: 0644]
python/edu/resources/tips/images/deployment@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/deployment@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/deployment_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/dragToOpen.png [new file with mode: 0644]
python/edu/resources/tips/images/dragToOpen@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/dragToOpen@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/dragToOpen_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/editregexp.png [new file with mode: 0644]
python/edu/resources/tips/images/editregexp@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/editregexp@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/editregexp_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/emmet.png [new file with mode: 0644]
python/edu/resources/tips/images/emmet@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/emmet@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/emmet_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/enterDirectory.png [new file with mode: 0644]
python/edu/resources/tips/images/enterDirectory@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/enterDirectory@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/enterDirectory_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/extract_variable_1.png [new file with mode: 0644]
python/edu/resources/tips/images/extract_variable_1@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/extract_variable_1@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/extract_variable_1_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/extract_variable_2.png [new file with mode: 0644]
python/edu/resources/tips/images/extract_variable_2@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/extract_variable_2@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/extract_variable_2_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/gotoFileLineNumber.png [new file with mode: 0644]
python/edu/resources/tips/images/gotoFileLineNumber@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/gotoFileLineNumber@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/gotoFileLineNumber_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_class.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_class@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_class@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_class_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_symbol.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_symbol@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_symbol@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_symbol_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_template_icon.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_template_icon@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_template_icon@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_template_icon_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_view.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_view@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_view@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_view_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_view_icon.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_view_icon@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_view_icon@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/goto_view_icon_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/hierarchy_browser.png [new file with mode: 0644]
python/edu/resources/tips/images/hierarchy_browser@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/hierarchy_browser@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/hierarchy_browser_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/image_completion.png [new file with mode: 0644]
python/edu/resources/tips/images/image_completion@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/image_completion@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/image_completion_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/image_lookup.png [new file with mode: 0644]
python/edu/resources/tips/images/image_lookup@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/image_lookup@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/image_lookup_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/issueNavigation.png [new file with mode: 0644]
python/edu/resources/tips/images/issueNavigation1.png [new file with mode: 0644]
python/edu/resources/tips/images/issueNavigation1@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/issueNavigation1@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/issueNavigation1_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/issueNavigation@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/issueNavigation@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/issueNavigation_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/jumplist.png [new file with mode: 0644]
python/edu/resources/tips/images/jumplist@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/jumplist@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/jumplist_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/launch_console_in_debugger.png [new file with mode: 0644]
python/edu/resources/tips/images/launch_console_in_debugger@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/launch_console_in_debugger@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/launch_console_in_debugger_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/line_separator.png [new file with mode: 0644]
python/edu/resources/tips/images/line_separator@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/line_separator@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/line_separator_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/line_separator_folder.png [new file with mode: 0644]
python/edu/resources/tips/images/line_separator_folder@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/line_separator_folder@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/line_separator_folder_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/live_templates_1.png [new file with mode: 0644]
python/edu/resources/tips/images/live_templates_1@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/live_templates_1@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/live_templates_1_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/live_templates_2.png [new file with mode: 0644]
python/edu/resources/tips/images/live_templates_2@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/live_templates_2@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/live_templates_2_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/lower_left.png [new file with mode: 0644]
python/edu/resources/tips/images/lower_left@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/lower_left@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/lower_left_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/managepy.png [new file with mode: 0644]
python/edu/resources/tips/images/managepy@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/managepy@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/managepy_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/method_separator.png [new file with mode: 0644]
python/edu/resources/tips/images/method_separator@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/method_separator@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/method_separator_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/move_to_changelist.png [new file with mode: 0644]
python/edu/resources/tips/images/move_to_changelist@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/move_to_changelist@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/move_to_changelist_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/move_up_down_witharrows_down.png [new file with mode: 0644]
python/edu/resources/tips/images/move_up_down_witharrows_down@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/move_up_down_witharrows_down@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/move_up_down_witharrows_down_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/move_up_down_witharrows_initial.png [new file with mode: 0644]
python/edu/resources/tips/images/move_up_down_witharrows_initial@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/move_up_down_witharrows_initial@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/move_up_down_witharrows_initial_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/move_up_down_witharrows_up.png [new file with mode: 0644]
python/edu/resources/tips/images/move_up_down_witharrows_up@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/move_up_down_witharrows_up@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/move_up_down_witharrows_up_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/multicursor1@2x.png [new file with mode: 0755]
python/edu/resources/tips/images/multicursor1@2x_dark.png [new file with mode: 0755]
python/edu/resources/tips/images/multicursor@2x.png [new file with mode: 0755]
python/edu/resources/tips/images/multicursor@2x_dark.png [new file with mode: 0755]
python/edu/resources/tips/images/navigateToFilePath.png [new file with mode: 0644]
python/edu/resources/tips/images/navigateToFilePath@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/navigateToFilePath@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/navigateToFilePath_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/navigationbar.png [new file with mode: 0644]
python/edu/resources/tips/images/navigationbar@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/navigationbar@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/navigationbar_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/override_methods.png [new file with mode: 0644]
python/edu/resources/tips/images/override_methods@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/override_methods@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/override_methods_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/param_info.png [new file with mode: 0644]
python/edu/resources/tips/images/param_info@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/param_info@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/param_info_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/pyColoredFiles.png [new file with mode: 0644]
python/edu/resources/tips/images/pyColoredFiles@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/pyColoredFiles@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/pyColoredFiles_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/pyconsole.png [new file with mode: 0644]
python/edu/resources/tips/images/pyconsole@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/pyconsole@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/pyconsole_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/qdoc_live_template@2x-3.png [new file with mode: 0755]
python/edu/resources/tips/images/qdoc_live_template@2x_dark-3.png [new file with mode: 0755]
python/edu/resources/tips/images/quick_fix_options.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_fix_options@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_fix_options@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_fix_options_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_javadoc.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_javadoc@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_javadoc@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_javadoc_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_javadoc_in_lookups.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_javadoc_in_lookups@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_javadoc_in_lookups@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_javadoc_in_lookups_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_switch_scheme.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_switch_scheme@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_switch_scheme@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/quick_switch_scheme_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/recentSearch.png [new file with mode: 0644]
python/edu/resources/tips/images/recentSearch@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/recentSearch@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/recentSearch_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/recent_changes.png [new file with mode: 0644]
python/edu/resources/tips/images/recent_changes@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/recent_changes@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/recent_changes_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/recent_files_1.png [new file with mode: 0644]
python/edu/resources/tips/images/recent_files_1@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/recent_files_1@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/recent_files_1_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/recent_files_2.png [new file with mode: 0644]
python/edu/resources/tips/images/recent_files_2@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/recent_files_2@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/recent_files_2_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/refactor_this.png [new file with mode: 0644]
python/edu/resources/tips/images/refactor_this@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/refactor_this@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/refactor_this_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/rename.png [new file with mode: 0644]
python/edu/resources/tips/images/rename@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/rename@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/rename_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/reopen.png [new file with mode: 0644]
python/edu/resources/tips/images/reopen@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/reopen@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/reopen_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/searchEverywhere.png [new file with mode: 0644]
python/edu/resources/tips/images/searchEverywhere@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/searchEverywhere@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/searchEverywhere_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/searchEverywhere_lense.png [new file with mode: 0644]
python/edu/resources/tips/images/searchEverywhere_lense@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/searchEverywhere_lense@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/searchEverywhere_lense_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/search_settings.png [new file with mode: 0644]
python/edu/resources/tips/images/search_settings@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/search_settings@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/search_settings_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/select_in.png [new file with mode: 0644]
python/edu/resources/tips/images/select_in@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/select_in@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/select_in_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/select_tasks.png [new file with mode: 0644]
python/edu/resources/tips/images/select_tasks@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/select_tasks@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/select_tasks_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/showToolWindows.png [new file with mode: 0644]
python/edu/resources/tips/images/showToolWindows@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/showToolWindows@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/showToolWindows_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/showUsages.png [new file with mode: 0644]
python/edu/resources/tips/images/showUsages@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/showUsages@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/showUsages_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/show_applied_styles.png [new file with mode: 0644]
python/edu/resources/tips/images/show_applied_styles@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/show_applied_styles@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/show_applied_styles_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/show_hide_tool_window_bars.png [new file with mode: 0644]
python/edu/resources/tips/images/show_hide_tool_window_bars@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/show_hide_tool_window_bars@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/show_hide_tool_window_bars_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/sidebyside.png [new file with mode: 0644]
python/edu/resources/tips/images/sidebyside@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/sidebyside@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/sidebyside_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/speed_search.png [new file with mode: 0644]
python/edu/resources/tips/images/speed_search@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/speed_search@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/speed_search_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/switcher.png [new file with mode: 0644]
python/edu/resources/tips/images/switcher@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/switcher@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/switcher_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/tagNameCompletion.png [new file with mode: 0644]
python/edu/resources/tips/images/tagNameCompletion@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/tagNameCompletion@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/tagNameCompletion_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/terminal.png [new file with mode: 0644]
python/edu/resources/tips/images/terminal@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/terminal@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/terminal_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/todo_preview.png [new file with mode: 0644]
python/edu/resources/tips/images/todo_preview@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/todo_preview@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/todo_preview_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/todo_scopes.png [new file with mode: 0644]
python/edu/resources/tips/images/todo_scopes@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/todo_scopes@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/todo_scopes_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/try_except.png [new file with mode: 0644]
python/edu/resources/tips/images/try_except@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/try_except@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/try_except_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/vcsQuickList.png [new file with mode: 0644]
python/edu/resources/tips/images/vcsQuickList@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/vcsQuickList@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/vcsQuickList_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/wildcard_goto.png [new file with mode: 0644]
python/edu/resources/tips/images/wildcard_goto@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/wildcard_goto@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/wildcard_goto_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/word_completion.png [new file with mode: 0644]
python/edu/resources/tips/images/word_completion@2x.png [new file with mode: 0644]
python/edu/resources/tips/images/word_completion@2x_dark.png [new file with mode: 0644]
python/edu/resources/tips/images/word_completion_dark.png [new file with mode: 0644]
python/edu/resources/tips/moveFileToChangelist.html [new file with mode: 0644]
python/edu/src/META-INF/IdeTipsAndTricks.xml [new file with mode: 0644]
python/edu/src/META-INF/PyCharmEduPlugin.xml [new file with mode: 0644]
python/edu/src/META-INF/pycharm-edu.xml [new file with mode: 0644]
python/helpers/pycharm/behave_runner.py
python/src/com/jetbrains/python/PyAddImportFix.java [new file with mode: 0644]
python/src/com/jetbrains/python/PyBundle.properties
python/src/com/jetbrains/python/psi/PyUtil.java
python/src/com/jetbrains/python/psi/impl/PyFileImpl.java
python/src/com/jetbrains/python/psi/impl/PyStarImportElementImpl.java
python/src/com/jetbrains/python/run/PythonCommandLineState.java
python/testData/inspections/PyUnresolvedReferencesInspection/UnusedImportBeforeStarDunderAll/a.py [new file with mode: 0644]
python/testData/inspections/PyUnresolvedReferencesInspection/UnusedImportBeforeStarDunderAll/b.py [new file with mode: 0644]
python/testData/inspections/PyUnresolvedReferencesInspection/UnusedImportBeforeStarDunderAll/p1/__init__.py [new file with mode: 0644]
python/testData/inspections/PyUnresolvedReferencesInspection/UnusedImportBeforeStarDunderAll/p1/m1.py [new file with mode: 0644]
python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java
resources/src/idea/RichPlatformActions.xml

index eaeb82e1c4b45445342df240965707d9ce30e183..d495f952b7a86e018695fa48a664541969d4f03a 100644 (file)
@@ -50,7 +50,8 @@ def String getLibraryName(JpsLibrary lib) {
   def name = lib.name
   if (name.startsWith("#")) {
     if (lib.getRoots(JpsOrderRootType.COMPILED).size() != 1) {
-      projectBuilder.warning("Non-single entry module library $name: $lib.classpath");
+      def urls = lib.getRoots(JpsOrderRootType.COMPILED).collect {it.url}
+      projectBuilder.warning("Non-single entry module library $name: $urls");
     }
     File file = lib.getFiles(JpsOrderRootType.COMPILED)[0]
     return file.name
@@ -213,6 +214,7 @@ libraryLicense(name: "maven-core", version: "3.0.5", libraryNames: ["maven-core-
 libraryLicense(name: "plexus-component-annotations", version: "1.5.5", libraryNames: ["plexus-component-annotations-1.5.5.jar"], license: "Apache 2.0", url: "http://maven.apache.org/", licenseUrl: "http://maven.apache.org/license.html")
 libraryLicense(name: "Maven3", libraryNames: ["Maven3", "maven-dependency-tree-1.2.jar", "archetype-catalog-2.2.jar", "archetype-common-2.2.jar"], version: "3.0.5", license: "Apache 2.0", url: "http://maven.apache.org/", licenseUrl: "http://maven.apache.org/license.html")
 libraryLicense(name: "Gradle", version: "1.12", license: "Apache 2.0", url: "http://gradle.org/", licenseUrl: "http://gradle.org/license")
+libraryLicense(name: "gradle-tooling-api-2.0.jar", version: "2.0", license: "Apache 2.0", url: "http://gradle.org/", licenseUrl: "http://gradle.org/license")
 libraryLicense(name: "GradleJnaPosix", version: "1.0.3", license: "LGPL 2.1", url: "http://www.jruby.org/", licenseUrl: "http://www.gnu.org/licenses/lgpl-2.1.txt")
 libraryLicense(name: "Slf4j", version: "1.7.2", license: "MIT License", url: "http://slf4j.org/", licenseUrl: "http://slf4j.org/license.html")
 libraryLicense(name: "GradleGuava", version: "14.0.1", license: "Apache 2.0", url: "http://code.google.com/p/guava-libraries/", licenseUrl: "http://apache.org/licenses/LICENSE-2.0")
index 5bfbf09c79141e4aa15882616f800d54e0e2a546..20d95f8fff3d971674d7cb0438f879dec12868cc 100644 (file)
@@ -111,13 +111,13 @@ public class JavaDebuggerSupport extends DebuggerSupport {
   @Override
   @NotNull
   public DebuggerActionHandler getRunToCursorHandler() {
-    return myRunToCursorActionHandler;
+    return DISABLED;
   }
 
   @Override
   @NotNull
   public DebuggerActionHandler getForceRunToCursorHandler() {
-    return myForceRunToCursorActionHandler;
+    return DISABLED;
   }
 
   @Override
index d78731b0a3c8c43e6b54403c7fa918d2367fc39e..f2415373903127437da5b86fcf7b9de64674ef4d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2014 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.
@@ -161,6 +161,9 @@ public class ProjectJdksConfigurable extends MasterDetailsComponent {
   @Override
   @Nullable
   protected ArrayList<AnAction> createActions(final boolean fromPopup) {
+    if (myProjectJdksModel == null) {
+      return null;
+    }
     final ArrayList<AnAction> actions = new ArrayList<AnAction>();
     DefaultActionGroup group = new DefaultActionGroup(ProjectBundle.message("add.new.jdk.text"), true);
     group.getTemplatePresentation().setIcon(IconUtil.getAddIcon());
index bf083f92c66c2d083dbf4b1ea02f876206aea31e..a5867d66d176046c8957f43f50a2b1df651bc2d1 100644 (file)
@@ -44,6 +44,7 @@ import com.intellij.openapi.util.registry.Registry;
 import com.intellij.openapi.wm.ex.IdeFocusTraversalPolicy;
 import com.intellij.packaging.artifacts.Artifact;
 import com.intellij.ui.JBSplitter;
+import com.intellij.ui.OnePixelSplitter;
 import com.intellij.ui.components.panels.Wrapper;
 import com.intellij.ui.navigation.BackAction;
 import com.intellij.ui.navigation.ForwardAction;
@@ -174,12 +175,9 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se
   public JComponent createComponent() {
     myComponent = new MyPanel();
 
-    mySplitter = new JBSplitter(false, .15f);
+    mySplitter = Registry.is("ide.new.project.settings") ? new OnePixelSplitter(false, .15f) : new JBSplitter(false, .15f);
     mySplitter.setSplitterProportionKey("ProjectStructure.TopLevelElements");
     mySplitter.setHonorComponentsMinimumSize(true);
-    if (Registry.is("ide.new.project.settings")) {
-      mySplitter.setOnePixelMode();
-    }
 
     initSidePanel();
 
index 39453f32db4b252a8a75fb723bbcb6fccc4ad8b9..618f085f00bba4650736bb62861c62da9feef9e5 100644 (file)
@@ -206,7 +206,7 @@ public class ArtifactEditorImpl implements ArtifactEditorEx {
 
     myErrorPanelPlace.add(myValidationManager.getMainErrorPanel(), BorderLayout.CENTER);
 
-    JBSplitter splitter = new JBSplitter(false);
+    final JBSplitter splitter = Registry.is("ide.new.project.settings") ? new OnePixelSplitter(false) : new JBSplitter(false);
     final JPanel leftPanel = new JPanel(new BorderLayout());
     JPanel treePanel = myLayoutTreeComponent.getTreePanel();
     if (UIUtil.isUnderDarcula()) {
@@ -262,7 +262,6 @@ public class ArtifactEditorImpl implements ArtifactEditorEx {
     }
     splitter.setSecondComponent(rightPanel);
     if (Registry.is("ide.new.project.settings")) {
-      splitter.setOnePixelMode();
       splitter.getDivider().setBackground(UIUtil.getPanelBackground());
       treePanel.setBorder(new EmptyBorder(0, 0, 0, 0));
       rightPanel.setBorder(new EmptyBorder(0, 0, 0, 0));
index d8f4012f1b0ef59c860d89b6ca2b1f887fe4a018..116f792ef93f577bc62b7007fa1760b8bc91e77e 100644 (file)
@@ -74,14 +74,17 @@ public abstract class VcsLogAction<Repo extends Repository> extends DumbAwareAct
   }
 
   private boolean isEnabled(@NotNull MultiMap<Repo, VcsFullCommitDetails> grouped) {
-    Mode mode = getMode();
-    if (mode == Mode.SINGLE_COMMIT) {
-      return grouped.size() == 1;
+    if (grouped.isEmpty()) {
+      return false;
     }
-    if (mode == Mode.SINGLE_PER_REPO) {
-      return allValuesAreSingletons(grouped);
+    switch (getMode()) {
+      case SINGLE_COMMIT:
+        return grouped.size() == 1;
+      case SINGLE_PER_REPO:
+        return allValuesAreSingletons(grouped);
+      default:
+        return false;
     }
-    return false;
   }
 
   @Nullable
index cb0e1a298c9ce74a19d0250d587de33732e95302..e6b2553085a8bce796d8a0e4bfed3622c4979e7e 100644 (file)
@@ -72,6 +72,7 @@ public class UISettings implements PersistentStateComponent<UISettings>, Exporta
   public int RECENT_FILES_LIMIT = 50;
   public int CONSOLE_COMMAND_HISTORY_LIMIT = 300;
   public int EDITOR_TAB_LIMIT = 10;
+  public int EDITOR_TAB_TITLE_LIMIT = 100;
   public boolean ANIMATE_WINDOWS = true;
   public int ANIMATION_SPEED = 2000; // Pixels per second
   public boolean SHOW_TOOL_WINDOW_NUMBERS = true;
index 770578ae44f51bffac9f80184dcd46353805a622..449de84f46279dc68974cd36c9c6a1a7b8f3ff20 100644 (file)
@@ -39,6 +39,7 @@ import com.intellij.openapi.roots.ModuleRootModificationUtil;
 import com.intellij.openapi.util.SystemInfo;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VfsUtilCore;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.packaging.artifacts.Artifact;
 import com.intellij.packaging.impl.compiler.ArtifactCompileScope;
@@ -455,9 +456,11 @@ public abstract class ExternalSystemTestCase extends UsefulTestCase {
   }
 
   protected void assertArtifactOutput(String artifactName, TestFileSystemItem fs) {
-    final String outputPath = ArtifactsTestUtil.findArtifact(myProject, artifactName).getOutputPath();
-    assert outputPath != null;
-    fs.assertDirectoryEqual(new File(outputPath));
+    final Artifact artifact = ArtifactsTestUtil.findArtifact(myProject, artifactName);
+    final VirtualFile outputFile = artifact.getOutputFile();
+    assert outputFile != null;
+    final File file = VfsUtilCore.virtualToIoFile(outputFile);
+    fs.assertFileEqual(file);
   }
 
   private static void setFileContent(final VirtualFile file, final String content, final boolean advanceStamps) throws IOException {
index b8caf760446dda38a48c0bc0e81b4c4b3ef40e78..5dafc2db8acf6ff8c2c5984b8dc51ecfe36d9520 100644 (file)
@@ -884,10 +884,10 @@ public class FindModel extends UserDataHolderBase implements Cloneable {
     doApplyContextChange(inStringLiteralsOnly, SearchContext.IN_STRING_LITERALS);
   }
 
-  public void doApplyContextChange(boolean inCommentsOnly, SearchContext option) {
+  private void doApplyContextChange(boolean newOptionValue, SearchContext option) {
     boolean changed = false;
-    if (inCommentsOnly) {
-      changed = searchContext == option;
+    if (newOptionValue) {
+      changed = searchContext != option;
       searchContext = option;
     } else if (searchContext == option) { // do not reset unrelated value
       changed = true;
index 9872c7c624aab50e24446ec5813bb438a401fc10..db23ce17b2c31880ba57f4d9e770636bdfce22ff 100644 (file)
@@ -3,7 +3,7 @@
   <grid id="27dc6" binding="myRootPanel" layout-manager="GridLayoutManager" row-count="3" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
     <margin top="0" left="0" bottom="0" right="0"/>
     <constraints>
-      <xy x="20" y="20" width="500" height="527"/>
+      <xy x="20" y="20" width="500" height="585"/>
     </constraints>
     <properties/>
     <border type="none"/>
           <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
         </constraints>
       </vspacer>
-      <grid id="eb8d0" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="10">
+      <grid id="eb8d0" layout-manager="GridLayoutManager" row-count="4" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="10">
         <margin top="0" left="0" bottom="0" right="0"/>
         <constraints>
           <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
         </clientProperties>
         <border type="none" title-resource-bundle="messages/ApplicationBundle" title-key="group.tab.closing.policy"/>
         <children>
-          <grid id="5a5a7" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+          <grid id="5a5a7" layout-manager="GridLayoutManager" row-count="2" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
             <margin top="0" left="0" bottom="0" right="0"/>
             <constraints>
               <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
             <children>
               <component id="527a6" class="javax.swing.JLabel">
                 <constraints>
-                  <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+                  <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false">
+                    <preferred-size width="60" height="27"/>
+                  </grid>
                 </constraints>
                 <properties>
                   <text resource-bundle="messages/ApplicationBundle" key="editbox.tab.limit"/>
               <component id="16477" class="javax.swing.JTextField" binding="myEditorTabLimitField">
                 <constraints>
                   <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="0" indent="0" use-parent-layout="false">
-                    <preferred-size width="30" height="-1"/>
+                    <preferred-size width="30" height="27"/>
                   </grid>
                 </constraints>
                 <properties>
                   <text value="15"/>
                 </properties>
               </component>
+              <component id="2479d" class="javax.swing.JLabel">
+                <constraints>
+                  <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="4" fill="0" indent="0" use-parent-layout="false"/>
+                </constraints>
+                <properties>
+                  <text resource-bundle="messages/ApplicationBundle" key="editbox.tab.title.limit"/>
+                </properties>
+              </component>
+              <component id="3499c" class="javax.swing.JTextField" binding="myTabTitleLimitField">
+                <constraints>
+                  <grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="2" anchor="8" fill="0" indent="0" use-parent-layout="false">
+                    <preferred-size width="30" height="27"/>
+                  </grid>
+                </constraints>
+                <properties>
+                  <columns value="2"/>
+                  <text value="30"/>
+                </properties>
+              </component>
             </children>
           </grid>
           <grid id="9b723" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="2">
             <margin top="0" left="0" bottom="0" right="0"/>
             <constraints>
-              <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+              <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
             </constraints>
             <properties/>
             <border type="none"/>
           <grid id="611cc" layout-manager="GridLayoutManager" row-count="4" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="2">
             <margin top="10" left="0" bottom="0" right="0"/>
             <constraints>
-              <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
+              <grid row="3" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
             </constraints>
             <properties/>
             <border type="none"/>
index 4e1de817255aad07898f440efb530899058458dc..8db2a882bfc7938e9a195b3646e9781e7bc5d4e2 100644 (file)
@@ -45,6 +45,7 @@ public class EditorTabsConfigurable implements EditorOptionsProvider {
   private JCheckBox myShowCloseButtonOnCheckBox;
   private JCheckBox myShowDirectoryInTabCheckBox;
   private JRadioButton myActivateRightNeighbouringTabRadioButton;
+  private JTextField myTabTitleLimitField;
 
   public EditorTabsConfigurable() {
     myEditorTabPlacement.setModel(new DefaultComboBoxModel(new Object[]{
@@ -119,6 +120,7 @@ public class EditorTabsConfigurable implements EditorOptionsProvider {
     myHideKnownExtensions.setSelected(uiSettings.HIDE_KNOWN_EXTENSION_IN_TABS);
     myShowDirectoryInTabCheckBox.setSelected(uiSettings.SHOW_DIRECTORY_FOR_NON_UNIQUE_FILENAMES);
     myEditorTabLimitField.setText(Integer.toString(uiSettings.EDITOR_TAB_LIMIT));
+    myTabTitleLimitField.setText(Integer.toString(uiSettings.EDITOR_TAB_TITLE_LIMIT));
     myShowCloseButtonOnCheckBox.setSelected(uiSettings.SHOW_CLOSE_BUTTON);
 
     if (uiSettings.CLOSE_NON_MODIFIED_FILES_FIRST) {
@@ -171,14 +173,29 @@ public class EditorTabsConfigurable implements EditorOptionsProvider {
     uiSettings.ACTIVATE_RIGHT_EDITOR_ON_CLOSE = myActivateRightNeighbouringTabRadioButton.isSelected();
 
     String temp = myEditorTabLimitField.getText();
-    if(temp.trim().length() > 0){
+    if (temp.trim().length() > 0) {
       try {
         int newEditorTabLimit = Integer.parseInt(temp);
-        if(newEditorTabLimit>0&&newEditorTabLimit!=uiSettings.EDITOR_TAB_LIMIT){
-          uiSettings.EDITOR_TAB_LIMIT=newEditorTabLimit;
+        if (newEditorTabLimit > 0 && newEditorTabLimit != uiSettings.EDITOR_TAB_LIMIT) {
+          uiSettings.EDITOR_TAB_LIMIT = newEditorTabLimit;
           uiSettingsChanged = true;
         }
-      }catch (NumberFormatException ignored){}
+      }
+      catch (NumberFormatException ignored) {
+      }
+    }
+    temp = myTabTitleLimitField.getText();
+    if (temp.trim().length() > 0) {
+      try {
+        int newTabTitleLimit = Integer.parseInt(temp);
+        newTabTitleLimit = Math.max(10, Math.min(100, newTabTitleLimit));
+        if (newTabTitleLimit != uiSettings.EDITOR_TAB_TITLE_LIMIT){
+          uiSettings.EDITOR_TAB_TITLE_LIMIT = newTabTitleLimit;
+          uiSettingsChanged = true;
+        }
+      }
+      catch (NumberFormatException ignored) {
+      }
     }
     if(uiSettingsChanged){
       uiSettings.fireUISettingsChanged();
@@ -191,6 +208,7 @@ public class EditorTabsConfigurable implements EditorOptionsProvider {
     boolean isModified = isModified(myCbModifiedTabsMarkedWithAsterisk, uiSettings.MARK_MODIFIED_TABS_WITH_ASTERISK);
     isModified |= isModified(myShowTabsTooltipsCheckBox, uiSettings.SHOW_TABS_TOOLTIPS);
     isModified |= isModified(myEditorTabLimitField, uiSettings.EDITOR_TAB_LIMIT);
+    isModified |= isModified(myTabTitleLimitField, uiSettings.EDITOR_TAB_TITLE_LIMIT);
     int tabPlacement = ((Integer)myEditorTabPlacement.getSelectedItem()).intValue();
     isModified |= tabPlacement != uiSettings.EDITOR_TAB_PLACEMENT;
     isModified |= myHideKnownExtensions.isSelected() != uiSettings.HIDE_KNOWN_EXTENSION_IN_TABS;
index cd49d111950bde346d1be54d51e33a19dfb88d6b..17916e008501517f14f05683dfa80a40b2953918 100644 (file)
@@ -29,6 +29,7 @@ import com.intellij.openapi.fileTypes.FileType;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiDocumentManager;
 import com.intellij.psi.PsiFile;
 import com.intellij.psi.codeStyle.CodeStyleSettings;
 import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
@@ -42,20 +43,41 @@ import org.jetbrains.annotations.NotNull;
 public class IndentingBackspaceHandler extends BackspaceHandlerDelegate {
   private static final Logger LOG = Logger.getInstance(IndentingBackspaceHandler.class);
 
+  private boolean isApplicable;
   private boolean caretWasAtLineStart;
+  private String precalculatedSpacing;
 
   @Override
   public void beforeCharDeleted(char c, PsiFile file, Editor editor) {
-    caretWasAtLineStart = editor.getCaretModel().getLogicalPosition().column == 0;
-  }
-
-  @Override
-  public boolean charDeleted(char c, PsiFile file, Editor editor) {
     if (CodeInsightSettings.getInstance().SMART_BACKSPACE != CodeInsightSettings.AUTOINDENT || !StringUtil.isWhiteSpace(c)) {
-      return false;
+      isApplicable = false;
+      return;
     }
     LanguageCodeStyleSettingsProvider codeStyleSettingsProvider = LanguageCodeStyleSettingsProvider.forLanguage(file.getLanguage());
     if (codeStyleSettingsProvider != null && codeStyleSettingsProvider.isIndentBasedLanguageSemantics()) {
+      isApplicable = false;
+      return;
+    }
+    Document document = editor.getDocument();
+    CharSequence charSequence = document.getCharsSequence();
+    CaretModel caretModel = editor.getCaretModel();
+    int caretOffset = caretModel.getOffset();
+    LogicalPosition pos = caretModel.getLogicalPosition();
+    isApplicable = true;
+    caretWasAtLineStart = pos.column == 0;
+    precalculatedSpacing = null;
+    if (caretWasAtLineStart && pos.line > 0 && caretOffset < charSequence.length() && !StringUtil.isWhiteSpace(charSequence.charAt(caretOffset))) {
+      int prevLineEnd = document.getLineEndOffset(pos.line - 1);
+      if (prevLineEnd > 0 && !StringUtil.isWhiteSpace(charSequence.charAt(prevLineEnd - 1))) {
+        PsiDocumentManager.getInstance(file.getProject()).commitDocument(document);
+        precalculatedSpacing = getSpacing(file, caretOffset);
+      }
+    }
+  }
+
+  @Override
+  public boolean charDeleted(char c, PsiFile file, Editor editor) {
+    if (!isApplicable) {
       return false;
     }
 
@@ -65,13 +87,19 @@ public class IndentingBackspaceHandler extends BackspaceHandlerDelegate {
 
     int caretOffset = caretModel.getOffset();
     int offset = CharArrayUtil.shiftForward(document.getCharsSequence(), caretOffset, " \t");
-    int offsetInPsi = getOffsetInPsi(document, file, offset);
     int beforeWhitespaceOffset = CharArrayUtil.shiftBackward(document.getCharsSequence(), offset - 1, " \t") + 1;
     LogicalPosition logicalPosition = caretOffset < offset ? editor.offsetToLogicalPosition(offset) : caretModel.getLogicalPosition();
     int lineStartOffset = document.getLineStartOffset(logicalPosition.line);
     if (lineStartOffset < beforeWhitespaceOffset) {
       if (caretWasAtLineStart && beforeWhitespaceOffset <= offset) {
-        String spacing = getSpacing(file, offsetInPsi);
+        String spacing;
+        if (precalculatedSpacing == null) {
+          PsiDocumentManager.getInstance(project).commitDocument(document);
+          spacing = getSpacing(file, offset);
+        }
+        else {
+          spacing = precalculatedSpacing;
+        }
         if (beforeWhitespaceOffset < offset || !spacing.isEmpty()) {
           document.replaceString(beforeWhitespaceOffset, offset, spacing);
           caretModel.moveToOffset(beforeWhitespaceOffset + spacing.length());
@@ -81,9 +109,9 @@ public class IndentingBackspaceHandler extends BackspaceHandlerDelegate {
       return false;
     }
 
+    PsiDocumentManager.getInstance(project).commitDocument(document);
     CodeStyleFacade codeStyleFacade = CodeStyleFacade.getInstance(project);
-    // We should calculate indent at line containing the text after caret, cause that text might affect the result (e.g. closing brace in Java)
-    String indent = codeStyleFacade.getLineIndent(document, offsetInPsi);
+    String indent = codeStyleFacade.getLineIndent(document, offset);
     if (indent == null) {
       return false;
     }
@@ -114,7 +142,7 @@ public class IndentingBackspaceHandler extends BackspaceHandlerDelegate {
     int targetOffset = CharArrayUtil.shiftBackward(document.getCharsSequence(), prevLineEndOffset - 1, " \t") + 1;
 
     if (prevLineStartOffset < targetOffset) {
-      String spacing = getSpacing(file, offsetInPsi);
+      String spacing = getSpacing(file, offset);
       document.replaceString(targetOffset, offset, spacing);
       caretModel.moveToOffset(targetOffset + spacing.length());
     }
@@ -125,11 +153,6 @@ public class IndentingBackspaceHandler extends BackspaceHandlerDelegate {
     return true;
   }
 
-  private static int getOffsetInPsi(Document document, PsiFile file, int offset) {
-    int psiLength = file.getTextLength();
-    return Math.max(0, Math.min(psiLength, offset + psiLength - document.getTextLength()));
-  }
-
   private static int getTabSize(@NotNull CodeStyleFacade codeStyleFacade, @NotNull Document document) {
     VirtualFile file = FileDocumentManager.getInstance().getFile(document);
     FileType fileType = file == null ? null : file.getFileType();
index c760310cd39166dcab106499cfadfd1cf9a605db..87e1323fe607a41958d4fe93f104b9e555dffbe4 100644 (file)
@@ -9,6 +9,7 @@ import com.intellij.execution.ui.ConsoleView;
 import com.intellij.execution.ui.ConsoleViewContentType;
 import com.intellij.execution.ui.ObservableConsoleView;
 import com.intellij.icons.AllIcons;
+import com.intellij.ide.util.PropertiesComponent;
 import com.intellij.openapi.Disposable;
 import com.intellij.openapi.actionSystem.AnAction;
 import com.intellij.openapi.actionSystem.AnActionEvent;
@@ -34,6 +35,8 @@ public class DuplexConsoleView<S extends ConsoleView, T extends ConsoleView> ext
   private final S myPrimaryConsoleView;
   @NotNull
   private final T mySecondaryConsoleView;
+  @Nullable
+  private final String myStateStorageKey;
 
   private boolean myPrimary;
   @Nullable
@@ -41,25 +44,46 @@ public class DuplexConsoleView<S extends ConsoleView, T extends ConsoleView> ext
   @NotNull
   private final SwitchDuplexConsoleViewAction mySwitchConsoleAction;
 
+
   public DuplexConsoleView(@NotNull S primaryConsoleView, @NotNull T secondaryConsoleView) {
+    this(primaryConsoleView, secondaryConsoleView, null);
+  }
+
+  public DuplexConsoleView(@NotNull S primaryConsoleView, @NotNull T secondaryConsoleView, @Nullable String stateStorageKey) {
     super(new CardLayout());
     myPrimaryConsoleView = primaryConsoleView;
     mySecondaryConsoleView = secondaryConsoleView;
+    myStateStorageKey = stateStorageKey;
 
     add(myPrimaryConsoleView.getComponent(), PRIMARY_CONSOLE_PANEL);
     add(mySecondaryConsoleView.getComponent(), SECONDARY_CONSOLE_PANEL);
 
-    mySwitchConsoleAction = new SwitchDuplexConsoleViewAction(this);
+    mySwitchConsoleAction = new SwitchDuplexConsoleViewAction();
 
     myPrimary = true;
-    enableConsole(false);
+    enableConsole(getStoredState());
 
     Disposer.register(this, myPrimaryConsoleView);
     Disposer.register(this, mySecondaryConsoleView);
   }
 
-  public static <S extends ConsoleView, T extends ConsoleView> DuplexConsoleView<S, T> create(S primary, T secondary) {
-    return new DuplexConsoleView<S, T>(primary, secondary);
+  public static <S extends ConsoleView, T extends ConsoleView> DuplexConsoleView<S, T> create(@NotNull S primary,
+                                                                                              @NotNull T secondary,
+                                                                                              @Nullable String stateStorageKey) {
+    return new DuplexConsoleView<S, T>(primary, secondary, stateStorageKey);
+  }
+
+  private void setStoredState(boolean primary) {
+    if (myStateStorageKey != null) {
+      PropertiesComponent.getInstance().setValue(myStateStorageKey, String.valueOf(primary));
+    }
+  }
+
+  private boolean getStoredState() {
+    if (myStateStorageKey == null) {
+      return false;
+    }
+    return PropertiesComponent.getInstance().getBoolean(myStateStorageKey, false);
   }
 
   public void enableConsole(boolean primary) {
@@ -215,23 +239,22 @@ public class DuplexConsoleView<S extends ConsoleView, T extends ConsoleView> ext
     return mySwitchConsoleAction.getTemplatePresentation();
   }
 
-  private static class SwitchDuplexConsoleViewAction extends ToggleAction implements DumbAware {
-    private final DuplexConsoleView myConsole;
+  private class SwitchDuplexConsoleViewAction extends ToggleAction implements DumbAware {
 
-    public SwitchDuplexConsoleViewAction(final DuplexConsoleView console) {
+    public SwitchDuplexConsoleViewAction() {
       super(ExecutionBundle.message("run.configuration.show.command.line.action.name"), null,
             AllIcons.Debugger.ToolConsole);
-      myConsole = console;
     }
 
     @Override
     public boolean isSelected(final AnActionEvent event) {
-      return !myConsole.isPrimaryConsoleEnabled();
+      return !isPrimaryConsoleEnabled();
     }
 
     @Override
     public void setSelected(final AnActionEvent event, final boolean flag) {
-      myConsole.enableConsole(!flag);
+      enableConsole(!flag);
+      setStoredState(!flag);
       ApplicationManager.getApplication().invokeLater(new Runnable() {
         @Override
         public void run() {
@@ -244,12 +267,12 @@ public class DuplexConsoleView<S extends ConsoleView, T extends ConsoleView> ext
     public void update(final AnActionEvent event) {
       super.update(event);
       final Presentation presentation = event.getPresentation();
-      final boolean isRunning = myConsole.myProcessHandler != null && !myConsole.myProcessHandler.isProcessTerminated();
+      final boolean isRunning = myProcessHandler != null && !myProcessHandler.isProcessTerminated();
       if (isRunning) {
         presentation.setEnabled(true);
       }
       else {
-        myConsole.enableConsole(true);
+        enableConsole(true);
         presentation.putClientProperty(SELECTED_PROPERTY, false);
         presentation.setEnabled(false);
       }
index 4c21ddbefeb4684a105b721d9c8be5f8ced7b6e8..83d0131565b790748e2dfdcd60824fb33b839505 100644 (file)
@@ -1084,7 +1084,7 @@ public class FindDialog extends DialogWrapper {
     if (myModel.isInCommentsOnly()) searchContext = FindBundle.message("find.context.in.comments.scope.label");
     else if (myModel.isInStringLiteralsOnly()) searchContext = FindBundle.message("find.context.in.literals.scope.label");
     else if (myModel.isExceptStringLiterals()) searchContext = FindBundle.message("find.context.except.literals.scope.label");
-    else if (myModel.isExceptComments()) searchContext = FindBundle.message("find.context.except.literals.scope.label");
+    else if (myModel.isExceptComments()) searchContext = FindBundle.message("find.context.except.comments.scope.label");
     else if (myModel.isExceptCommentsAndStringLiterals()) searchContext = FindBundle.message("find.context.except.comments.and.literals.scope.label");
     mySearchContext.setSelectedItem(searchContext);
 
index d93795419fb04c28c9b4cc2067f2e108302770ec..0aace901a409890fafc8fba3df65c11eb22e568d 100644 (file)
@@ -17,11 +17,13 @@ package com.intellij.find.impl;
 
 import com.intellij.codeInsight.hint.HintUtil;
 import com.intellij.ide.BrowserUtil;
+import com.intellij.openapi.Disposable;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.ui.popup.ComponentPopupBuilder;
 import com.intellij.openapi.ui.popup.JBPopup;
 import com.intellij.openapi.ui.popup.JBPopupFactory;
 import com.intellij.openapi.ui.popup.util.MinimizeButton;
+import com.intellij.openapi.util.Disposer;
 import com.intellij.ui.ScrollPaneFactory;
 import com.intellij.ui.components.labels.LinkLabel;
 import com.intellij.ui.components.labels.LinkListener;
@@ -339,16 +341,30 @@ public class RegExHelpPopup extends JPanel {
   @NotNull
   public static LinkLabel createRegExLink(@NotNull String title, @Nullable final Component owner, @Nullable final Logger logger) {
     return new LinkLabel(title, null, new LinkListener() {
+      JBPopup helpPopup;
       @Override
       public void linkSelected(LinkLabel aSource, Object aLinkData) {
         try {
-          final JBPopup helpPopup = createRegExHelpPopup();
+          if (helpPopup != null && !helpPopup.isDisposed() && helpPopup.isVisible()) {
+            return;
+          }
+          helpPopup = createRegExHelpPopup();
+          Disposer.register(helpPopup, new Disposable() {
+            @Override
+            public void dispose() {
+              destroyPopup();
+            }
+          });
           helpPopup.showInCenterOf(owner);
         }
         catch (BadLocationException e) {
           if (logger != null) logger.info(e);
         }
       }
+
+      private void destroyPopup() {
+        helpPopup = null;
+      }
     });
   }
 
index ee44bdf2f08bf3fe7fd510f4239f874228184940..bf3d383aeebb7552ae52b3396718d0a88f0fabba 100644 (file)
@@ -26,11 +26,13 @@ import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.ui.*;
 import com.intellij.ui.treeStructure.treetable.TreeColumnInfo;
 import com.intellij.util.PlatformIcons;
+import com.intellij.util.containers.Convertor;
 import com.intellij.util.ui.ColumnInfo;
 import com.intellij.util.ui.ComboBoxCellEditor;
 import com.intellij.util.ui.tree.TreeUtil;
 import com.intellij.xml.util.XmlStringUtil;
 import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
@@ -38,12 +40,11 @@ import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.TableCellEditor;
 import javax.swing.table.TableCellRenderer;
 import javax.swing.table.TableColumn;
+import javax.swing.tree.TreePath;
 import java.awt.*;
 import java.io.File;
-import java.util.Arrays;
-import java.util.HashMap;
+import java.util.*;
 import java.util.List;
-import java.util.Map;
 
 /**
  * This dialog allows selecting paths inside selected archives or directories.
@@ -108,17 +109,17 @@ public class DetectedRootsChooserDialog extends DialogWrapper {
   private JScrollPane myPane;
   private String myDescription;
 
-  public DetectedRootsChooserDialog(Component component, List<SuggestedChildRootInfo> suggestedRoots) {
+  public DetectedRootsChooserDialog(Component component, Collection<SuggestedChildRootInfo> suggestedRoots) {
     super(component, true);
     init(suggestedRoots);
   }
 
-  public DetectedRootsChooserDialog(Project project, List<SuggestedChildRootInfo> suggestedRoots) {
+  public DetectedRootsChooserDialog(Project project, Collection<SuggestedChildRootInfo> suggestedRoots) {
     super(project, true);
     init(suggestedRoots);
   }
 
-  private void init(List<SuggestedChildRootInfo> suggestedRoots) {
+  private void init(Collection<SuggestedChildRootInfo> suggestedRoots) {
     myDescription = XmlStringUtil.wrapInHtml(ApplicationNamesInfo.getInstance().getFullProductName() +
                     " just scanned files and detected the following " + StringUtil.pluralize("root", suggestedRoots.size()) + ".<br>" +
                     "Select items in the tree below or press Cancel to cancel operation.");
@@ -128,7 +129,7 @@ public class DetectedRootsChooserDialog extends DialogWrapper {
     init();
   }
 
-  private static CheckboxTreeTable createTreeTable(List<SuggestedChildRootInfo> suggestedRoots) {
+  private static CheckboxTreeTable createTreeTable(Collection<SuggestedChildRootInfo> suggestedRoots) {
     final CheckedTreeNode root = createRoot(suggestedRoots);
     CheckboxTreeTable treeTable = new CheckboxTreeTable(root, new CheckboxTree.CheckboxTreeCellRenderer(true) {
       @Override
@@ -189,14 +190,30 @@ public class DetectedRootsChooserDialog extends DialogWrapper {
     column.setPreferredWidth(width);
     column.setMaxWidth(width);
     treeTable.setRootVisible(false);
+    new TreeTableSpeedSearch(treeTable, new Convertor<TreePath, String>() {
+      @Override
+      public String convert(TreePath o) {
+        Object node = o.getLastPathComponent();
+        if (!(node instanceof VirtualFileCheckedTreeNode)) return "";
+        return ((VirtualFileCheckedTreeNode)node).getFile().getPresentableUrl();
+      }
+    });
     TreeUtil.expandAll(treeTable.getTree());
     return treeTable;
   }
 
-  private static CheckedTreeNode createRoot(List<SuggestedChildRootInfo> suggestedRoots) {
+  private static CheckedTreeNode createRoot(Collection<SuggestedChildRootInfo> suggestedRoots) {
+    SuggestedChildRootInfo[] sortedRoots = suggestedRoots.toArray(new SuggestedChildRootInfo[suggestedRoots.size()]);
+    Arrays.sort(sortedRoots, new Comparator<SuggestedChildRootInfo>() {
+      @Override
+      public int compare(@NotNull SuggestedChildRootInfo o1, @NotNull SuggestedChildRootInfo o2) {
+        return o1.getDetectedRoot().getFile().getPresentableUrl().compareTo(o2.getDetectedRoot().getFile().getPresentableUrl());
+      }
+    });
+
     CheckedTreeNode root = new CheckedTreeNode(null);
     Map<VirtualFile, CheckedTreeNode> rootCandidateNodes = new HashMap<VirtualFile, CheckedTreeNode>();
-    for (SuggestedChildRootInfo rootInfo : suggestedRoots) {
+    for (SuggestedChildRootInfo rootInfo : sortedRoots) {
       final VirtualFile rootCandidate = rootInfo.getRootCandidate();
       CheckedTreeNode parent = rootCandidateNodes.get(rootCandidate);
       if (parent == null) {
@@ -230,6 +247,12 @@ public class DetectedRootsChooserDialog extends DialogWrapper {
     return "DetectedRootsChooserDialog";
   }
 
+  @Nullable
+  @Override
+  public JComponent getPreferredFocusedComponent() {
+    return myTreeTable;
+  }
+
   private static class VirtualFileCheckedTreeNode extends CheckedTreeNode {
     private final VirtualFile myFile;
 
index 743e408b8c971e37a4314c0a9c174221e8c34fc0..725216600ffa2a376e78799f73b29336877ed0b5 100644 (file)
@@ -19,6 +19,7 @@ import com.intellij.openapi.roots.libraries.LibraryRootType;
 import com.intellij.openapi.roots.libraries.ui.DetectedLibraryRoot;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.util.ArrayUtil;
+import org.jetbrains.annotations.NotNull;
 
 import java.util.Arrays;
 import java.util.Map;
@@ -32,17 +33,19 @@ class SuggestedChildRootInfo {
   private final Map<LibraryRootType, String> myRootTypeNames;
   private LibraryRootType mySelectedRootType;
 
-  SuggestedChildRootInfo(VirtualFile rootCandidate, DetectedLibraryRoot detectedRoot, Map<LibraryRootType, String> rootTypeNames) {
+  SuggestedChildRootInfo(@NotNull VirtualFile rootCandidate, @NotNull DetectedLibraryRoot detectedRoot, @NotNull Map<LibraryRootType, String> rootTypeNames) {
     myRootCandidate = rootCandidate;
     myDetectedRoot = detectedRoot;
     myRootTypeNames = rootTypeNames;
     mySelectedRootType = detectedRoot.getTypes().get(0);
   }
 
+  @NotNull
   public VirtualFile getRootCandidate() {
     return myRootCandidate;
   }
 
+  @NotNull
   public DetectedLibraryRoot getDetectedRoot() {
     return myDetectedRoot;
   }
@@ -51,6 +54,7 @@ class SuggestedChildRootInfo {
     return myRootTypeNames.get(type);
   }
 
+  @NotNull
   public LibraryRootType getSelectedRootType() {
     return mySelectedRootType;
   }
@@ -64,6 +68,7 @@ class SuggestedChildRootInfo {
     }
   }
 
+  @NotNull
   public String[] getRootTypeNames() {
     final String[] types = ArrayUtil.toStringArray(myRootTypeNames.values());
     Arrays.sort(types, String.CASE_INSENSITIVE_ORDER);
index 330c084291fd85130946568d8d7bfecba78fc4c0..04f908a17c00c6e9e0ca909d14894678a0de02a9 100644 (file)
@@ -39,6 +39,7 @@ import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.openapi.vfs.VirtualFileManager;
 import com.intellij.openapi.vfs.ex.VirtualFileManagerAdapter;
 import com.intellij.ui.JBSplitter;
+import com.intellij.ui.OnePixelSplitter;
 import com.intellij.ui.ScrollPaneFactory;
 import com.intellij.ui.border.CustomLineBorder;
 import com.intellij.ui.roots.ToolbarPanel;
@@ -171,10 +172,7 @@ public class CommonContentEntriesEditor extends ModuleElementsEditor {
     }
     entriesPanel.add(toolbarPanel, BorderLayout.CENTER);
 
-    final JBSplitter splitter = new JBSplitter(false);
-    if (Registry.is("ide.new.project.settings")) {
-      splitter.setOnePixelMode();
-    }
+    final JBSplitter splitter = Registry.is("ide.new.project.settings") ? new OnePixelSplitter(false) : new JBSplitter(false);
     splitter.setProportion(0.6f);
     splitter.setHonorComponentsMinimumSize(true);
 
index 89c531ec4bc53c500ef3fc0425b6491299946b8e..6427765295c5ade486b88398830a5239859407c3 100644 (file)
@@ -367,7 +367,7 @@ public class MapReduceIndex<Key, Value, Input> implements UpdatableIndex<Key,Val
                     "Unexpected difference in indexing of %s by index %s, file type %s, charset %s\ndiff %s\nprevious indexed info %s",
                     fileContent.getFile(),
                     myIndexId,
-                    fileContent.getFileType(),
+                    fileContent.getFileType().getName(),
                     ((FileContentImpl)fileContent).getCharset(),
                     buildDiff(data, contentData),
                     myIndexingTrace.get(hashId)
@@ -396,7 +396,7 @@ public class MapReduceIndex<Key, Value, Input> implements UpdatableIndex<Key,Val
 
           FileContent fileContent = (FileContent)content;
           try {
-            myIndexingTrace.put(hashId, ((FileContentImpl)fileContent).getCharset() + "," + fileContent.getFileType()+"," + fileContent.getFile().getPath() + "," +
+            myIndexingTrace.put(hashId, ((FileContentImpl)fileContent).getCharset() + "," + fileContent.getFileType().getName()+"," + fileContent.getFile().getPath() + "," +
                                         ExceptionUtil.getThrowableText(new Throwable()));
           } catch (IOException ex) {
             LOG.error(ex);
index 18961ca843c3ac18def1e84fa74582e04cddaab9..fcbaa21f330b02b13bc2a591f75c7be7cf133db7 100644 (file)
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2000-2014 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.intellij.webcore.packaging;
 
 import com.intellij.icons.AllIcons;
@@ -93,6 +108,7 @@ public class ManagePackagesDialog extends DialogWrapper {
           public void run() {
             try {
               myController.reloadAllPackages();
+              initModel();
               myPackages.setPaintBusy(false);
             }
             catch (final IOException e) {
@@ -310,6 +326,7 @@ public class ManagePackagesDialog extends DialogWrapper {
             @Override
             public void run() {
               myPackages.setModel(myPackagesModel);
+              ((MyPackageFilter)myFilter).filter();
               doSelectPackage(mySelectedPackageName);
               setDownloadStatus(false);
             }
@@ -473,6 +490,7 @@ public class ManagePackagesDialog extends DialogWrapper {
       final Object pyPackage = myPackages.getSelectedValue();
       if (pyPackage instanceof RepoPackage) {
         final String packageName = ((RepoPackage)pyPackage).getName();
+        mySelectedPackageName = packageName;
         myVersionComboBox.removeAllItems();
         if (myVersionCheckBox.isEnabled()) {
           myController.fetchPackageVersions(packageName, new CatchingConsumer<List<String>, Exception>() {
index c4913f888f1bd0ec1aeb299570fdc3e0f1beac20..f51179dfa5d82b96c59f9d863c5452085e52fa8f 100644 (file)
@@ -31,4 +31,22 @@ public class IndentingBackspaceHandlerUncommittedDocumentTest extends LightPlatf
     checkResultByText("class Foo {\n" +
                       "<caret>}");
   }
+
+  public void testMulticaretSequentialBackspaceInvocation() throws IOException {
+    configureFromFileText(getTestName(false) + ".java",
+                          "class Foo {\n" +
+                          "    void m1() {\n" +
+                          "    \n" +
+                          "    <caret>}\n" +
+                          "    void m2() {\n" +
+                          "    \n" +
+                          "    <caret>}\n" +
+                          "}");
+    backspace();
+    backspace();
+    checkResultByText("class Foo {\n" +
+                      "    void m1() {<caret>}\n" +
+                      "    void m2() {<caret>}\n" +
+                      "}");
+  }
 }
\ No newline at end of file
index 440fd699ef7d7da7ee98eb6cec1e85bd73ea7b6a..bd98591b4cb391916be38a440913a0b289d819d6 100644 (file)
@@ -67,9 +67,18 @@ public class Paths {
   }
 
   public static Iterable<String> split(String path) {
-    Iterable<String> result = StringUtil.tokenize(path, String.valueOf(DELIM));
-    if (path.indexOf(DELIM) == 0) {
-      result = ContainerUtil.concat(Collections.singleton(String.valueOf(DELIM)), result);
+    //must be consistent with LocalFileSystemBase.extractRootPath()
+    int prefixLen = 0;
+    if (path.startsWith("//")) {
+      prefixLen = path.indexOf(DELIM, 2);
+      if (prefixLen == -1) prefixLen = path.length();
+    }
+    else if (StringUtil.startsWithChar(path, DELIM)) {
+      prefixLen = 1;
+    }
+    Iterable<String> result = StringUtil.tokenize(path.substring(prefixLen), String.valueOf(DELIM));
+    if (prefixLen > 0) {
+      result = ContainerUtil.concat(Collections.singleton(path.substring(0, prefixLen)), result);
     }
     return result;
   }
index 26537316b4e9f48d2fc230f3e908821366acb779..d630bad790dff435c8b26ea1f10e233de3edf31f 100644 (file)
@@ -41,18 +41,28 @@ public class FragmentContent extends DiffContent {
   private final FileType myType;
   private final MyDocumentsSynchronizer mySynchonizer;
   public static final Key<Document> ORIGINAL_DOCUMENT = new Key<Document>("ORIGINAL_DOCUMENT");
+  private final boolean myForceReadOnly;
 
   public FragmentContent(@NotNull DiffContent original, @NotNull TextRange range, Project project, VirtualFile file) {
-    this(original, range, project, file != null ? DiffContentUtil.getContentType(file) : null);
+    this(original, range, project, file, false);
+  }
+
+  public FragmentContent(@NotNull DiffContent original, @NotNull TextRange range, Project project, VirtualFile file, boolean forceReadOnly) {
+    this(original, range, project, file != null ? DiffContentUtil.getContentType(file) : null, forceReadOnly);
   }
 
   public FragmentContent(@NotNull DiffContent original, @NotNull TextRange range, Project project, FileType fileType) {
+    this(original, range, project, fileType, false);
+  }
+
+  public FragmentContent(@NotNull DiffContent original, @NotNull TextRange range, Project project, FileType fileType, boolean forceReadOnly) {
     RangeMarker rangeMarker = original.getDocument().createRangeMarker(range.getStartOffset(), range.getEndOffset(), true);
     rangeMarker.setGreedyToLeft(true);
     rangeMarker.setGreedyToRight(true);
     mySynchonizer = new MyDocumentsSynchronizer(project, rangeMarker);
     myOriginal = original;
     myType = fileType;
+    myForceReadOnly = forceReadOnly;
   }
 
   public FragmentContent(DiffContent original, TextRange range, Project project) {
@@ -152,7 +162,7 @@ public class FragmentContent extends DiffContent {
       String textInRange =
         originalDocument.getCharsSequence().subSequence(myRangeMarker.getStartOffset(), myRangeMarker.getEndOffset()).toString();
       final Document result = EditorFactory.getInstance().createDocument(textInRange);
-      result.setReadOnly(!originalDocument.isWritable());
+      result.setReadOnly(myForceReadOnly || !originalDocument.isWritable());
       result.putUserData(ORIGINAL_DOCUMENT, originalDocument);
       return result;
     }
index 53572a523bc0cb1fa091e4d4229f3c309290d706..c64439f678ba0680bcc89cfdffe0aa5f1003c55e 100644 (file)
@@ -131,12 +131,9 @@ public abstract class MasterDetailsComponent implements Configurable, DetailsCom
   protected MasterDetailsComponent(MasterDetailsState state) {
     myState = state;
 
-    mySplitter = new JBSplitter(false, .2f);
+    mySplitter = Registry.is("ide.new.project.settings") ? new OnePixelSplitter(false, .2f) : new JBSplitter(false, .2f);
     mySplitter.setSplitterProportionKey("ProjectStructure.SecondLevelElements");
     mySplitter.setHonorComponentsMinimumSize(true);
-    if (Registry.is("ide.new.project.settings")) {
-      mySplitter.setOnePixelMode();
-    }
 
     installAutoScroll();
     reInitWholePanelIfNeeded();
diff --git a/platform/platform-api/src/com/intellij/openapi/ui/OnePixelDivider.java b/platform/platform-api/src/com/intellij/openapi/ui/OnePixelDivider.java
new file mode 100644 (file)
index 0000000..2b00970
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+ * Copyright 2000-2014 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.intellij.openapi.ui;
+
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.util.Disposer;
+import com.intellij.openapi.util.SystemInfo;
+import com.intellij.openapi.util.Weighted;
+import com.intellij.openapi.wm.IdeGlassPane;
+import com.intellij.openapi.wm.IdeGlassPaneUtil;
+import com.intellij.ui.Gray;
+import com.intellij.ui.JBColor;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+/**
+ * @author Konstantin Bulenkov
+ */
+public class OnePixelDivider extends Divider {
+  private boolean myVertical;
+  private Splitter mySplitter;
+  private boolean myResizeEnabled;
+  private boolean mySwitchOrientationEnabled;
+  protected Point myPoint;
+  private IdeGlassPane myGlassPane;
+  private final MouseAdapter myListener = new MyMouseAdapter();
+  private Disposable myDisposable;
+
+  public OnePixelDivider(boolean vertical, Splitter splitter) {
+    super(new GridBagLayout());
+    mySplitter = splitter;
+    myResizeEnabled = true;
+    mySwitchOrientationEnabled = false;
+    setFocusable(false);
+    enableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
+    //setOpaque(false);
+    setOrientation(vertical);
+    setBackground(new JBColor(Gray._153.withAlpha(128), Gray._100.withAlpha(128)));
+  }
+
+  @Override
+  public void addNotify() {
+    super.addNotify();
+    init();
+  }
+
+  @Override
+  public void removeNotify() {
+    super.removeNotify();
+    if (myDisposable != null && !Disposer.isDisposed(myDisposable)) {
+      Disposer.dispose(myDisposable);
+    }
+  }
+
+  private boolean dragging = false;
+  private class MyMouseAdapter extends MouseAdapter implements Weighted {
+    @Override
+    public void mousePressed(MouseEvent e) {
+      dragging = isInDragZone(e);
+      _processMouseEvent(e);
+    }
+
+    boolean isInDragZone(MouseEvent e) {
+      final MouseEvent event = getTargetEvent(e);
+      final Point p = event.getPoint();
+      final int r = Math.abs(isVertical() ? p.y : p.x);
+      return r < 6;
+    }
+
+    @Override
+    public void mouseReleased(MouseEvent e) {
+      _processMouseEvent(e);
+      dragging = false;
+    }
+
+    @Override
+    public void mouseMoved(MouseEvent e) {
+      final OnePixelDivider divider = OnePixelDivider.this;
+      if (isInDragZone(e)) {
+        myGlassPane.setCursor(divider.getCursor(), divider);
+      } else {
+        myGlassPane.setCursor(null, divider);
+      }
+      _processMouseMotionEvent(e);
+    }
+
+    @Override
+    public void mouseDragged(MouseEvent e) {
+      _processMouseMotionEvent(e);
+    }
+    @Override
+    public double getWeight() {
+      return 1;
+    }
+    private void _processMouseMotionEvent(MouseEvent e) {
+      MouseEvent event = getTargetEvent(e);
+      if (event == null) {
+        myGlassPane.setCursor(null, myListener);
+        return;
+      }
+
+      processMouseMotionEvent(event);
+      if (event.isConsumed()) {
+        e.consume();
+      }
+    }
+
+    private void _processMouseEvent(MouseEvent e) {
+      MouseEvent event = getTargetEvent(e);
+      if (event == null) {
+        myGlassPane.setCursor(null, myListener);
+        return;
+      }
+
+      processMouseEvent(event);
+      if (event.isConsumed()) {
+        e.consume();
+      }
+    }
+  }
+
+  private MouseEvent getTargetEvent(MouseEvent e) {
+    return SwingUtilities.convertMouseEvent(e.getComponent(), e, this);
+  }
+
+  private void init() {
+    myGlassPane = IdeGlassPaneUtil.find(this);
+    myDisposable = Disposer.newDisposable();
+    myGlassPane.addMouseMotionPreprocessor(myListener, myDisposable);
+    myGlassPane.addMousePreprocessor(myListener, myDisposable);
+  }
+
+  public void setOrientation(boolean vertical) {
+    removeAll();
+    myVertical = vertical;
+    final int cursorType = isVertical() ? Cursor.N_RESIZE_CURSOR : Cursor.W_RESIZE_CURSOR;
+    setCursor(Cursor.getPredefinedCursor(cursorType));
+  }
+
+  @Override
+  protected void processMouseMotionEvent(MouseEvent e) {
+    super.processMouseMotionEvent(e);
+    if (!myResizeEnabled) return;
+    if (MouseEvent.MOUSE_DRAGGED == e.getID() && dragging) {
+      myPoint = SwingUtilities.convertPoint(this, e.getPoint(), mySplitter);
+      float proportion;
+      final float firstMinProportion = getMinProportion(mySplitter.getFirstComponent());
+      final float secondMinProportion = getMinProportion(mySplitter.getSecondComponent());
+      if (isVertical()) {
+        if (getHeight() > 0) {
+          proportion = Math.min(1.0f, Math
+            .max(.0f, Math.min(Math.max(firstMinProportion, (float)myPoint.y / (float)mySplitter.getHeight()), 1 - secondMinProportion)));
+          mySplitter.setProportion(proportion);
+        }
+      }
+      else {
+        if (getWidth() > 0) {
+          proportion = Math.min(1.0f, Math.max(.0f, Math.min(
+            Math.max(firstMinProportion, (float)myPoint.x / (float)mySplitter.getWidth()), 1 - secondMinProportion)));
+          mySplitter.setProportion(proportion);
+        }
+      }
+    }
+  }
+
+  private float getMinProportion(JComponent component) {
+    if (component != null &&
+        mySplitter.getFirstComponent() != null &&
+        mySplitter.getFirstComponent().isVisible() &&
+        mySplitter.getSecondComponent() != null &&
+        mySplitter.getSecondComponent().isVisible()) {
+      if (isVertical()) {
+        return (float)component.getMinimumSize().height / (float)(mySplitter.getHeight() - 1);
+      } else {
+        return (float)component.getMinimumSize().width / (float)(mySplitter.getWidth() - 1);
+      }
+    }
+
+    return 0.0f;
+  }
+
+  @Override
+  protected void processMouseEvent(MouseEvent e) {
+    super.processMouseEvent(e);
+    if (e.getID() == MouseEvent.MOUSE_CLICKED) {
+      if (mySwitchOrientationEnabled
+          && e.getClickCount() == 1
+          && SwingUtilities.isLeftMouseButton(e) && (SystemInfo.isMac ? e.isMetaDown() : e.isControlDown())) {
+        mySplitter.setOrientation(!mySplitter.getOrientation());
+      }
+      if (myResizeEnabled && e.getClickCount() == 2) {
+        mySplitter.setProportion(.5f);
+      }
+    }
+  }
+
+  public void setResizeEnabled(boolean resizeEnabled) {
+    myResizeEnabled = resizeEnabled;
+    if (!myResizeEnabled) {
+      setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+    }
+    else {
+      setCursor(isVertical() ?
+                Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR) :
+                Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));
+    }
+  }
+
+  public void setSwitchOrientationEnabled(boolean switchOrientationEnabled) {
+    mySwitchOrientationEnabled = switchOrientationEnabled;
+  }
+
+
+  public boolean isVertical() {
+    return myVertical;
+  }
+}
diff --git a/platform/platform-api/src/com/intellij/ui/CheckboxTreeAdapter.java b/platform/platform-api/src/com/intellij/ui/CheckboxTreeAdapter.java
new file mode 100644 (file)
index 0000000..186904a
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2000-2014 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.intellij.ui;
+
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author nik
+ */
+public abstract class CheckboxTreeAdapter implements CheckboxTreeListener {
+  @Override
+  public void mouseDoubleClicked(@NotNull CheckedTreeNode node) {
+  }
+
+  @Override
+  public void nodeStateChanged(@NotNull CheckedTreeNode node) {
+  }
+
+  @Override
+  public void beforeNodeStateChanged(@NotNull CheckedTreeNode node) {
+  }
+}
index d9755f342a3fe2df119a3513345775166732fea9..88f433f7c62a24310c5104e989e37bd3f29edd8e 100644 (file)
 package com.intellij.ui;
 
 import com.intellij.ui.treeStructure.Tree;
+import com.intellij.util.EventDispatcher;
 import com.intellij.util.ui.UIUtil;
-import com.intellij.util.ui.tree.TreeUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
-import javax.swing.tree.*;
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreeCellRenderer;
+import javax.swing.tree.TreeNode;
 import java.awt.*;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseEvent;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Enumeration;
 
 public class CheckboxTreeBase extends Tree {
-  private final CheckPolicy myCheckPolicy;
-  private static final CheckPolicy DEFAULT_POLICY = new CheckPolicy(true, true, false, true);
+  private final CheckboxTreeHelper myHelper;
+  private final EventDispatcher<CheckboxTreeListener> myEventDispatcher;
 
   public CheckboxTreeBase() {
     this(new CheckboxTreeCellRendererBase(), null);
   }
 
   public CheckboxTreeBase(final CheckboxTreeCellRendererBase cellRenderer, CheckedTreeNode root) {
-    this(cellRenderer, root, DEFAULT_POLICY);
+    this(cellRenderer, root, CheckboxTreeHelper.DEFAULT_POLICY);
   }
 
   public CheckboxTreeBase(CheckboxTreeCellRendererBase cellRenderer, @Nullable CheckedTreeNode root, CheckPolicy checkPolicy) {
-    myCheckPolicy = checkPolicy;
-
-    setRootVisible(false);
-    setShowsRootHandles(true);
-    setLineStyleAngled();
-    TreeUtil.installActions(this);
-
-    installRenderer(cellRenderer);
-
-    addKeyListener(new KeyAdapter() {
-      public void keyPressed(KeyEvent e) {
-        if (isToggleEvent(e)) {
-          TreePath treePath = getLeadSelectionPath();
-          if (treePath == null) return;
-          final Object o = treePath.getLastPathComponent();
-          if (!(o instanceof CheckedTreeNode)) return;
-          CheckedTreeNode firstNode = (CheckedTreeNode)o;
-          boolean checked = toggleNode(firstNode);
-
-          TreePath[] selectionPaths = getSelectionPaths();
-          for (int i = 0; selectionPaths != null && i < selectionPaths.length; i++) {
-            final TreePath selectionPath = selectionPaths[i];
-            final Object o1 = selectionPath.getLastPathComponent();
-            if (!(o1 instanceof CheckedTreeNode)) continue;
-            CheckedTreeNode node = (CheckedTreeNode)o1;
-            checkNode(node, checked);
-            ((DefaultTreeModel)getModel()).nodeChanged(node);
-          }
-
-          e.consume();
-        }
+    myEventDispatcher = EventDispatcher.create(CheckboxTreeListener.class);
+    myEventDispatcher.addListener(new CheckboxTreeListener() {
+      @Override
+      public void mouseDoubleClicked(@NotNull CheckedTreeNode node) {
+        onDoubleClick(node);
+      }
+
+      @Override
+      public void nodeStateChanged(@NotNull CheckedTreeNode node) {
+        CheckboxTreeBase.this.onNodeStateChanged(node);
+      }
+
+      @Override
+      public void beforeNodeStateChanged(@NotNull CheckedTreeNode node) {
+        CheckboxTreeBase.this.nodeStateWillChange(node);
       }
     });
+    myHelper = new CheckboxTreeHelper(checkPolicy, myEventDispatcher);
+    myHelper.initTree(this, this, cellRenderer);
 
     setSelectionRow(0);
     if (root != null) {
@@ -84,55 +66,37 @@ public class CheckboxTreeBase extends Tree {
     }
   }
 
+  @Deprecated
   public void installRenderer(final CheckboxTreeCellRendererBase cellRenderer) {
     setCellRenderer(cellRenderer);
-    new ClickListener() {
-      @Override
-      public boolean onClick(@NotNull MouseEvent e, int clickCount) {
-        int row = getRowForLocation(e.getX(), e.getY());
-        if (row < 0) return false;
-        final Object o = getPathForRow(row).getLastPathComponent();
-        if (!(o instanceof CheckedTreeNode)) return false;
-        Rectangle rowBounds = getRowBounds(row);
-        cellRenderer.setBounds(rowBounds);
-        Rectangle checkBounds = cellRenderer.myCheckbox.getBounds();
-        checkBounds.setLocation(rowBounds.getLocation());
-
-        if (checkBounds.height == 0) checkBounds.height = checkBounds.width = rowBounds.height;
-
-        final CheckedTreeNode node = (CheckedTreeNode)o;
-        if (checkBounds.contains(e.getPoint())) {
-          if (node.isEnabled()) {
-            toggleNode(node);
-            setSelectionRow(row);
-            return true;
-          }
-        }
-        else if (clickCount > 1) {
-          onDoubleClick(node);
-          return true;
-        }
-        return false;
-      }
-    }.installOn(this);
   }
 
-  protected void onDoubleClick(final CheckedTreeNode node) {
+  /**
+   * @deprecated use {@link #setNodeState} to change node state or subscribe to {@link #addCheckboxTreeListener} to get notifications about state changes
+   */
+  @Deprecated
+  protected boolean toggleNode(CheckedTreeNode node) {
+    setNodeState(node, !node.isChecked());
+    return node.isChecked();
   }
 
-  protected boolean isToggleEvent(KeyEvent e) {
-    return e.getKeyCode() == KeyEvent.VK_SPACE;
+  /**
+   * @deprecated use {@link #setNodeState} to change node state or subscribe to {@link #addCheckboxTreeListener} to get notifications about state changes
+   */
+  @Deprecated
+  protected void checkNode(CheckedTreeNode node, boolean checked) {
+    setNodeState(node, checked);
   }
 
-  protected boolean toggleNode(CheckedTreeNode node) {
-    boolean checked = !node.isChecked();
-    checkNode(node, checked);
+  public void setNodeState(@NotNull CheckedTreeNode node, boolean checked) {
+    myHelper.setNodeState(this, node, checked);
+  }
 
-    // notify model listeners about model change
-    final TreeModel model = getModel();
-    model.valueForPathChanged(new TreePath(node.getPath()), node.getUserObject());
+  public void addCheckboxTreeListener(@NotNull CheckboxTreeListener listener) {
+    myEventDispatcher.addListener(listener);
+  }
 
-    return checked;
+  protected void onDoubleClick(final CheckedTreeNode node) {
   }
 
   /**
@@ -144,38 +108,8 @@ public class CheckboxTreeBase extends Tree {
    * @param <T>      the type of the node
    * @return an array of collected nodes
    */
-  @SuppressWarnings("unchecked")
   public <T> T[] getCheckedNodes(final Class<T> nodeType, @Nullable final NodeFilter<T> filter) {
-    final ArrayList<T> nodes = new ArrayList<T>();
-    final Object root = getModel().getRoot();
-    if (!(root instanceof CheckedTreeNode)) {
-      throw new IllegalStateException(
-        "The root must be instance of the " + CheckedTreeNode.class.getName() + ": " + root.getClass().getName());
-    }
-    new Object() {
-      @SuppressWarnings("unchecked")
-      public void collect(CheckedTreeNode node) {
-        if (node.isLeaf()) {
-          Object userObject = node.getUserObject();
-          if (node.isChecked() && userObject != null && nodeType.isAssignableFrom(userObject.getClass())) {
-            final T value = (T)userObject;
-            if (filter != null && !filter.accept(value)) return;
-            nodes.add(value);
-          }
-        }
-        else {
-          for (int i = 0; i < node.getChildCount(); i++) {
-            final TreeNode child = node.getChildAt(i);
-            if (child instanceof CheckedTreeNode) {
-              collect((CheckedTreeNode)child);
-            }
-          }
-        }
-      }
-    }.collect((CheckedTreeNode)root);
-    T[] result = (T[])Array.newInstance(nodeType, nodes.size());
-    nodes.toArray(result);
-    return result;
+    return CheckboxTreeHelper.getCheckedNodes(nodeType, filter, getModel());
   }
 
 
@@ -184,118 +118,14 @@ public class CheckboxTreeBase extends Tree {
     return -1;
   }
 
-  protected void checkNode(CheckedTreeNode node, boolean checked) {
-    adjustParentsAndChildren(node, checked);
-    repaint();
-  }
-
   protected void onNodeStateChanged(CheckedTreeNode node) {
-
   }
 
   protected void nodeStateWillChange(CheckedTreeNode node) {
-
-  }
-
-  protected void adjustParentsAndChildren(final CheckedTreeNode node, final boolean checked) {
-    changeNodeState(node, checked);
-    if (!checked) {
-      if (myCheckPolicy.uncheckParentWithUncheckedChild) {
-        TreeNode parent = node.getParent();
-        while (parent != null) {
-          if (parent instanceof CheckedTreeNode) {
-            changeNodeState((CheckedTreeNode)parent, false);
-          }
-          parent = parent.getParent();
-        }
-      }
-      if (myCheckPolicy.uncheckChildrenWithUncheckedParent) {
-        uncheckChildren(node);
-      }
-
-    }
-    else {
-      if (myCheckPolicy.checkChildrenWithCheckedParent) {
-        checkChildren(node);
-      }
-
-      if (myCheckPolicy.checkParentWithCheckedChild) {
-        TreeNode parent = node.getParent();
-        while (parent != null) {
-          if (parent instanceof CheckedTreeNode) {
-            changeNodeState((CheckedTreeNode)parent, true);
-          }
-          parent = parent.getParent();
-        }
-      }
-
-    }
-    repaint();
-  }
-
-  private void changeNodeState(final CheckedTreeNode node, final boolean checked) {
-    if (node.isChecked() != checked) {
-      nodeStateWillChange(node);
-      node.setChecked(checked);
-      onNodeStateChanged(node);
-    }
-  }
-
-  private void uncheckChildren(final CheckedTreeNode node) {
-    final Enumeration children = node.children();
-    while (children.hasMoreElements()) {
-      final Object o = children.nextElement();
-      if (!(o instanceof CheckedTreeNode)) continue;
-      CheckedTreeNode child = (CheckedTreeNode)o;
-      changeNodeState(child, false);
-      uncheckChildren(child);
-    }
-  }
-
-  private void checkChildren(final CheckedTreeNode node) {
-    final Enumeration children = node.children();
-    while (children.hasMoreElements()) {
-      final Object o = children.nextElement();
-      if (!(o instanceof CheckedTreeNode)) continue;
-      CheckedTreeNode child = (CheckedTreeNode)o;
-      changeNodeState(child, true);
-      checkChildren(child);
-    }
   }
 
+  @Deprecated
   protected void adjustParents(final CheckedTreeNode node, final boolean checked) {
-    TreeNode parentNode = node.getParent();
-    if (!(parentNode instanceof CheckedTreeNode)) return;
-    CheckedTreeNode parent = (CheckedTreeNode)parentNode;
-
-    if (!checked && isAllChildrenUnchecked(parent)) {
-      changeNodeState(parent, false);
-      adjustParents(parent, false);
-    }
-    else if (checked && isAllChildrenChecked(parent)) {
-      changeNodeState(parent, true);
-      adjustParents(parent, true);
-    }
-  }
-
-  private static boolean isAllChildrenUnchecked(final CheckedTreeNode node) {
-    for (int i = 0; i < node.getChildCount(); i++) {
-      final TreeNode o = node.getChildAt(i);
-      if ((o instanceof CheckedTreeNode) && ((CheckedTreeNode)o).isChecked()) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  private static boolean isAllChildrenChecked(final CheckedTreeNode node) {
-    for (int i = 0; i < node.getChildCount(); i++) {
-      final TreeNode o = node.getChildAt(i);
-      if ((o instanceof CheckedTreeNode) && !((CheckedTreeNode)o).isChecked()) {
-        return false;
-      }
-    }
-    return true;
   }
 
   public static class CheckboxTreeCellRendererBase extends JPanel implements TreeCellRenderer {
@@ -395,8 +225,8 @@ public class CheckboxTreeBase extends Tree {
     }
 
     /**
-     * @deprecated
      * @see CheckboxTreeCellRendererBase#customizeRenderer(javax.swing.JTree, Object, boolean, boolean, boolean, int, boolean)
+     * @deprecated
      */
     @Deprecated
     public void customizeCellRenderer(JTree tree,
similarity index 55%
rename from platform/lang-impl/src/com/intellij/openapi/roots/libraries/ui/impl/CheckboxTreeTable.java
rename to platform/platform-api/src/com/intellij/ui/CheckboxTreeHelper.java
index dd72da957fa2b5761145305803bf5699ac6e6378..3048d131caa76144a6cead67546c724e7489e641 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * Copyright 2000-2014 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.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.intellij.openapi.roots.libraries.ui.impl;
-
-import com.intellij.ui.CheckboxTree;
-import com.intellij.ui.CheckedTreeNode;
-import com.intellij.ui.ClickListener;
-import com.intellij.ui.dualView.TreeTableView;
-import com.intellij.ui.treeStructure.treetable.ListTreeTableModelOnColumns;
-import com.intellij.ui.treeStructure.treetable.TreeTableTree;
-import com.intellij.util.ui.ColumnInfo;
+package com.intellij.ui;
+
+import com.intellij.ui.speedSearch.SpeedSearchSupply;
+import com.intellij.ui.treeStructure.Tree;
+import com.intellij.util.EventDispatcher;
 import com.intellij.util.ui.tree.TreeUtil;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
-import javax.swing.tree.DefaultTreeModel;
+import javax.swing.*;
 import javax.swing.tree.TreeModel;
 import javax.swing.tree.TreeNode;
 import javax.swing.tree.TreePath;
@@ -40,122 +37,82 @@ import java.util.Enumeration;
 /**
  * @author nik
  */
-public class CheckboxTreeTable extends TreeTableView {
-  public CheckboxTreeTable(CheckedTreeNode root, CheckboxTree.CheckboxTreeCellRenderer renderer, final ColumnInfo[] columns) {
-    super(new ListTreeTableModelOnColumns(root, columns));
-    initTree(getTree(), renderer);
+class CheckboxTreeHelper {
+  static final CheckboxTreeBase.CheckPolicy DEFAULT_POLICY = new CheckboxTreeBase.CheckPolicy(true, true, false, true);
+  private final CheckboxTreeBase.CheckPolicy myCheckPolicy;
+  private final EventDispatcher<CheckboxTreeListener> myEventDispatcher;
+
+  CheckboxTreeHelper(CheckboxTreeBase.CheckPolicy checkPolicy, EventDispatcher<CheckboxTreeListener> dispatcher) {
+    myCheckPolicy = checkPolicy;
+    myEventDispatcher = dispatcher;
   }
 
-  //todo[nik] I hate to copy-paste but have to copy the code below from CheckboxTreeBase to support CheckboxTree inside TreeTable in IDEA 11.1.x branch
-  //todo[nik] I solemnly swear to get rid of this code in IDEA 12 branch
-  private void initTree(final TreeTableTree tree, final CheckboxTree.CheckboxTreeCellRenderer cellRenderer) {
+  public void initTree(@NotNull final Tree tree, JComponent mainComponent, CheckboxTreeBase.CheckboxTreeCellRendererBase cellRenderer) {
     tree.setCellRenderer(cellRenderer);
     tree.setRootVisible(false);
     tree.setShowsRootHandles(true);
     tree.setLineStyleAngled();
     TreeUtil.installActions(tree);
 
-    new ClickListener() {
-      @Override
-      public boolean onClick(@NotNull MouseEvent e, int clickCount) {
-        int row = tree.getRowForLocation(e.getX(), e.getY());
-        if (row < 0) return false;
-        final Object o = tree.getPathForRow(row).getLastPathComponent();
-        if (!(o instanceof CheckedTreeNode)) return false;
-        Rectangle rowBounds = tree.getRowBounds(row);
-        cellRenderer.setBounds(rowBounds);
-        Rectangle checkBounds = cellRenderer.myCheckbox.getBounds();
-        checkBounds.setLocation(rowBounds.getLocation());
-
-        if (checkBounds.height == 0) checkBounds.height = rowBounds.height;
-
-        final CheckedTreeNode node = (CheckedTreeNode)o;
-        if (checkBounds.contains(e.getPoint())) {
-          if (node.isEnabled()) {
-            toggleNode(node);
-            tree.setSelectionRow(row);
-            return true;
-          }
-        }
-
-        return false;
-      }
-    }.installOn(this);
-
-    addKeyListener(new KeyAdapter() {
-      @Override
-      public void keyPressed(KeyEvent e) {
-        if (isToggleEvent(e)) {
-          TreePath treePath = tree.getLeadSelectionPath();
-          if (treePath == null) return;
-          final Object o = treePath.getLastPathComponent();
-          if (!(o instanceof CheckedTreeNode)) return;
-          CheckedTreeNode firstNode = (CheckedTreeNode)o;
-          boolean checked = toggleNode(firstNode);
-
-          TreePath[] selectionPaths = tree.getSelectionPaths();
-          for (int i = 0; selectionPaths != null && i < selectionPaths.length; i++) {
-            final TreePath selectionPath = selectionPaths[i];
-            final Object o1 = selectionPath.getLastPathComponent();
-            if (!(o1 instanceof CheckedTreeNode)) continue;
-            CheckedTreeNode node = (CheckedTreeNode)o1;
-            checkNode(node, checked);
-            ((DefaultTreeModel)tree.getModel()).nodeChanged(node);
-          }
-
-          e.consume();
-        }
-      }
-    });
-
-    tree.setSelectionRow(0);
+    setupKeyListener(tree, mainComponent);
+    setupMouseListener(tree, mainComponent, cellRenderer);
   }
 
-  private static boolean isToggleEvent(KeyEvent e) {
-    return e.getKeyCode() == KeyEvent.VK_SPACE;
-  }
-
-  protected boolean toggleNode(CheckedTreeNode node) {
-    boolean checked = !node.isChecked();
-    checkNode(node, checked);
+  public void setNodeState(Tree tree, CheckedTreeNode node, boolean checked) {
+    changeNodeState(node, checked);
+    adjustParentsAndChildren(node, checked);
+    tree.repaint();
 
     // notify model listeners about model change
-    final TreeModel model = getTree().getModel();
+    final TreeModel model = tree.getModel();
     model.valueForPathChanged(new TreePath(node.getPath()), node.getUserObject());
-
-    return checked;
   }
 
-  private void checkNode(CheckedTreeNode node, boolean checked) {
-    adjustParentsAndChildren(node, checked);
-    repaint();
+  private void toggleNode(Tree tree, CheckedTreeNode node) {
+    setNodeState(tree, node, !node.isChecked());
   }
 
   private void adjustParentsAndChildren(final CheckedTreeNode node, final boolean checked) {
-    changeNodeState(node, checked);
     if (!checked) {
-      TreeNode parent = node.getParent();
-      while (parent != null) {
-        if (parent instanceof CheckedTreeNode) {
-          changeNodeState((CheckedTreeNode)parent, false);
+      if (myCheckPolicy.uncheckParentWithUncheckedChild) {
+        TreeNode parent = node.getParent();
+        while (parent != null) {
+          if (parent instanceof CheckedTreeNode) {
+            changeNodeState((CheckedTreeNode)parent, false);
+          }
+          parent = parent.getParent();
         }
-        parent = parent.getParent();
       }
-      uncheckChildren(node);
+      if (myCheckPolicy.uncheckChildrenWithUncheckedParent) {
+        uncheckChildren(node);
+      }
     }
     else {
-      checkChildren(node);
+      if (myCheckPolicy.checkChildrenWithCheckedParent) {
+        checkChildren(node);
+      }
+
+      if (myCheckPolicy.checkParentWithCheckedChild) {
+        TreeNode parent = node.getParent();
+        while (parent != null) {
+          if (parent instanceof CheckedTreeNode) {
+            changeNodeState((CheckedTreeNode)parent, true);
+          }
+          parent = parent.getParent();
+        }
+      }
     }
-    repaint();
   }
 
-  private static void changeNodeState(final CheckedTreeNode node, final boolean checked) {
+  private void changeNodeState(final CheckedTreeNode node, final boolean checked) {
     if (node.isChecked() != checked) {
+      myEventDispatcher.getMulticaster().beforeNodeStateChanged(node);
       node.setChecked(checked);
+      myEventDispatcher.getMulticaster().nodeStateChanged(node);
     }
   }
 
-  private static void uncheckChildren(final CheckedTreeNode node) {
+  private void uncheckChildren(final CheckedTreeNode node) {
     final Enumeration children = node.children();
     while (children.hasMoreElements()) {
       final Object o = children.nextElement();
@@ -166,7 +123,7 @@ public class CheckboxTreeTable extends TreeTableView {
     }
   }
 
-  private static void checkChildren(final CheckedTreeNode node) {
+  private void checkChildren(final CheckedTreeNode node) {
     final Enumeration children = node.children();
     while (children.hasMoreElements()) {
       final Object o = children.nextElement();
@@ -177,12 +134,77 @@ public class CheckboxTreeTable extends TreeTableView {
     }
   }
 
+  private void setupKeyListener(final Tree tree, final JComponent mainComponent) {
+    mainComponent.addKeyListener(new KeyAdapter() {
+      public void keyPressed(@NotNull KeyEvent e) {
+        if (isToggleEvent(e, mainComponent)) {
+          TreePath treePath = tree.getLeadSelectionPath();
+          if (treePath == null) return;
+          final Object o = treePath.getLastPathComponent();
+          if (!(o instanceof CheckedTreeNode)) return;
+          CheckedTreeNode firstNode = (CheckedTreeNode)o;
+          toggleNode(tree, firstNode);
+          boolean checked = firstNode.isChecked();
+
+          TreePath[] selectionPaths = tree.getSelectionPaths();
+          for (int i = 0; selectionPaths != null && i < selectionPaths.length; i++) {
+            final TreePath selectionPath = selectionPaths[i];
+            final Object o1 = selectionPath.getLastPathComponent();
+            if (!(o1 instanceof CheckedTreeNode)) continue;
+            CheckedTreeNode node = (CheckedTreeNode)o1;
+            setNodeState(tree, node, checked);
+          }
+
+          e.consume();
+        }
+      }
+    });
+  }
+
+  private static boolean isToggleEvent(KeyEvent e, JComponent mainComponent) {
+    return e.getKeyCode() == KeyEvent.VK_SPACE && SpeedSearchSupply.getSupply(mainComponent) == null;
+  }
+
+  private void setupMouseListener(final Tree tree, JComponent mainComponent, final CheckboxTreeBase.CheckboxTreeCellRendererBase cellRenderer) {
+    new ClickListener() {
+      @Override
+      public boolean onClick(@NotNull MouseEvent e, int clickCount) {
+        int row = tree.getRowForLocation(e.getX(), e.getY());
+        if (row < 0) return false;
+        final Object o = tree.getPathForRow(row).getLastPathComponent();
+        if (!(o instanceof CheckedTreeNode)) return false;
+        Rectangle rowBounds = tree.getRowBounds(row);
+        cellRenderer.setBounds(rowBounds);
+        Rectangle checkBounds = cellRenderer.myCheckbox.getBounds();
+        checkBounds.setLocation(rowBounds.getLocation());
+
+        if (checkBounds.height == 0) checkBounds.height = checkBounds.width = rowBounds.height;
+
+        final CheckedTreeNode node = (CheckedTreeNode)o;
+        if (checkBounds.contains(e.getPoint())) {
+          if (node.isEnabled()) {
+            toggleNode(tree, node);
+            tree.setSelectionRow(row);
+            return true;
+          }
+        }
+        else if (clickCount > 1) {
+          myEventDispatcher.getMulticaster().mouseDoubleClicked(node);
+          return true;
+        }
+
+        return false;
+      }
+    }.installOn(mainComponent);
+  }
+
   @SuppressWarnings("unchecked")
-  public <T> T[] getCheckedNodes(final Class<T> nodeType) {
+  public static <T> T[] getCheckedNodes(final Class<T> nodeType, @Nullable final Tree.NodeFilter<T> filter, final TreeModel model) {
     final ArrayList<T> nodes = new ArrayList<T>();
-    final Object root = getTree().getModel().getRoot();
+    final Object root = model.getRoot();
     if (!(root instanceof CheckedTreeNode)) {
-      throw new IllegalStateException("The root must be instance of the " + CheckedTreeNode.class.getName() + ": " + root.getClass().getName());
+      throw new IllegalStateException(
+        "The root must be instance of the " + CheckedTreeNode.class.getName() + ": " + root.getClass().getName());
     }
     new Object() {
       @SuppressWarnings("unchecked")
@@ -191,6 +213,7 @@ public class CheckboxTreeTable extends TreeTableView {
           Object userObject = node.getUserObject();
           if (node.isChecked() && userObject != null && nodeType.isAssignableFrom(userObject.getClass())) {
             final T value = (T)userObject;
+            if (filter != null && !filter.accept(value)) return;
             nodes.add(value);
           }
         }
diff --git a/platform/platform-api/src/com/intellij/ui/CheckboxTreeListener.java b/platform/platform-api/src/com/intellij/ui/CheckboxTreeListener.java
new file mode 100644 (file)
index 0000000..792c458
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2000-2014 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.intellij.ui;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.EventListener;
+
+/**
+ * @author nik
+ */
+public interface CheckboxTreeListener extends EventListener {
+  void mouseDoubleClicked(@NotNull CheckedTreeNode node);
+
+  void nodeStateChanged(@NotNull CheckedTreeNode node);
+
+  void beforeNodeStateChanged(@NotNull CheckedTreeNode node);
+}
index b4000dbcfae2c2f69c1bb62dd9788e17204fb552..5f01602d92c50692bb0cba6fcdb722b0bb33ea1d 100644 (file)
@@ -94,14 +94,6 @@ public class JBSplitter extends Splitter {
     saveProportion();
   }
 
-  public void setOnePixelMode() {
-    setDividerWidth(1);
-    setShowDividerIcon(false);
-    getDivider().setBackground(new JBColor(Gray._153.withAlpha(128), Gray._100.withAlpha(128)));
-    setShowDividerControls(false);
-    setOrientation(getOrientation());
-  }
-
   protected void loadProportion() {
     if (! StringUtil.isEmpty(mySplitterProportionKey)) {
       setProportion(PropertiesComponent.getInstance().getFloat(mySplitterProportionKey, myProportion));
diff --git a/platform/platform-api/src/com/intellij/ui/OnePixelSplitter.java b/platform/platform-api/src/com/intellij/ui/OnePixelSplitter.java
new file mode 100644 (file)
index 0000000..15dd5fd
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2000-2014 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.intellij.ui;
+
+import com.intellij.openapi.ui.Divider;
+import com.intellij.openapi.ui.OnePixelDivider;
+
+/**
+ * @author Konstantin Bulenkov
+ */
+public class OnePixelSplitter extends JBSplitter {
+
+  public OnePixelSplitter() {
+    super();
+    init();
+  }
+
+  public OnePixelSplitter(boolean vertical) {
+    super(vertical);
+    init();
+  }
+
+  public OnePixelSplitter(boolean vertical, float proportion) {
+    super(vertical, proportion);
+    init();
+  }
+
+  public OnePixelSplitter(float proportion) {
+    super(proportion);
+    init();
+  }
+
+  public OnePixelSplitter(boolean vertical, float proportion, float minProp, float maxProp) {
+    super(vertical, proportion, minProp, maxProp);
+    init();
+  }
+
+  protected void init() {
+    setDividerWidth(1);
+  }
+
+  @Override
+  protected Divider createDivider() {
+    return new OnePixelDivider(isVertical(), this);
+  }
+}
index d1dfa976e479d977220495f4c82fb8fbdf094788..c8c944c86e4aed263f06983d98a85bc6e82ba918 100644 (file)
@@ -92,6 +92,7 @@ public final class TabInfo implements Queryable, PlaceProvider<String> {
    * out of its container. (IDEA-61536)
    */
   private WeakReference<TabInfo> myPreviousSelection = new WeakReference<TabInfo>(null);
+  private boolean myTitleShortened;
 
   public TabInfo(final JComponent component) {
     myComponent = component;
@@ -392,6 +393,14 @@ public final class TabInfo implements Queryable, PlaceProvider<String> {
     return myPreviousSelection.get();
   }
 
+  public boolean isTitleShortened() {
+    return myTitleShortened;
+  }
+
+  public void setTitleIsShortened(boolean titleIsShortened) {
+    myTitleShortened = titleIsShortened;
+  }
+
   public interface DragOutDelegate {
 
     void dragOutStarted(MouseEvent mouseEvent, TabInfo info);
index 8e5844fd46847f31115be935443a4cb0885a747f..a842f623ac4569e84ec600434b277adf879822f3 100644 (file)
@@ -44,6 +44,7 @@ import java.util.List;
  */
 public class JBEditorTabs extends JBTabsImpl {
   public static final String TABS_ALPHABETICAL_KEY = "tabs.alphabetical";
+  static final String TABS_SHORTEN_TITLE_IF_NEED = "tabs.shorten.title.if.need";
   private JBEditorTabsPainter myDarkPainter = new DarculaEditorTabsPainter();
   private JBEditorTabsPainter myDefaultPainter = new DefaultEditorTabsPainter();
 
@@ -60,6 +61,13 @@ public class JBEditorTabs extends JBTabsImpl {
     return super.createSingleRowLayout();
   }
 
+  @Override
+  protected TabLabel createTabLabel(TabInfo info) {
+    TabLabel label = super.createTabLabel(info);
+    label.putClientProperty(TABS_SHORTEN_TITLE_IF_NEED, Boolean.TRUE);
+    return label;
+  }
+
   @Override
   public boolean isEditorTabs() {
     return true;
index 21c36d5dd66a58a9b6e6da10eb4abbbdc4b40490..a360c4e9294f235f23aa5668fdf06adee13d52da 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 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.
@@ -22,6 +22,7 @@ import com.intellij.openapi.actionSystem.ActionPlaces;
 import com.intellij.openapi.actionSystem.DefaultActionGroup;
 import com.intellij.openapi.util.Pass;
 import com.intellij.openapi.util.SystemInfo;
+import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.ui.*;
 import com.intellij.ui.components.panels.Wrapper;
 import com.intellij.ui.tabs.JBTabsPosition;
@@ -317,6 +318,16 @@ public class TabLabel extends JPanel {
 
 
   public void setText(final SimpleColoredText text) {
+    myInfo.setTitleIsShortened(false);
+    if (text != null && text.getTexts().size() == 1 && Boolean.TRUE == getClientProperty(JBEditorTabs.TABS_SHORTEN_TITLE_IF_NEED)) {
+      String title = text.getTexts().get(0);
+      if (title.length() > UISettings.getInstance().EDITOR_TAB_TITLE_LIMIT) {
+        SimpleTextAttributes attributes = text.getAttributes().get(0);
+        text.clear();
+        text.append(StringUtil.getShortened(title, UISettings.getInstance().EDITOR_TAB_TITLE_LIMIT), attributes);
+        myInfo.setTitleIsShortened(true);
+      }
+    }
     myLabel.change(new Runnable() {
       public void run() {
         myLabel.clear();
index a916d9e5bb34179391962e6437f25c65be99b569..372b14efcfe65f75044b3863c99ca91a7db484de 100644 (file)
@@ -73,8 +73,9 @@ public class CompareClipboardWithSelection extends BaseDiffAction {
       SelectionModel selectionModel = myEditor.getSelectionModel();
       if (selectionModel.hasSelection()) {
         TextRange range = new TextRange(selectionModel.getSelectionStart(), selectionModel.getSelectionEnd());
+        boolean forceReadOnly = myEditor.isViewer();
         myContents[1] = new FragmentContent(DiffContent.fromDocument(getProject(), getDocument()),
-                                            range, getProject(), getDocumentFile(getDocument()));
+                                            range, getProject(), getDocumentFile(getDocument()), forceReadOnly);
       }
       else {
         myContents [1] = DiffContent.fromDocument(getProject(), getDocument());
index 5f4507dcfad313502d7be3a4d49023dc84372c37..4b6a289d476e1474e54f3a30e1f33f979cb36df7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2009 JetBrains s.r.o.
+ * Copyright 2000-2014 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.
@@ -19,6 +19,7 @@ import com.intellij.openapi.diff.impl.highlighting.DiffPanelState;
 import com.intellij.openapi.diff.impl.splitter.DiffDividerPaint;
 import com.intellij.openapi.editor.event.VisibleAreaEvent;
 import com.intellij.openapi.editor.event.VisibleAreaListener;
+import com.intellij.openapi.ui.Divider;
 import com.intellij.openapi.ui.Splitter;
 
 import javax.swing.*;
@@ -43,8 +44,8 @@ class DiffSplitter extends Splitter implements DiffSplitterI {
     setHonorComponentsMinimumSize(false);
   }
 
-  protected Splitter.Divider createDivider() {
-    return new Divider(){
+  protected Divider createDivider() {
+    return new DividerImpl(){
       public void paint(Graphics g) {
         super.paint(g);
         myPaint.paint(g, this);
index c2353d5db20714b82c986b9cfc199f8426070420..03b03faffe03ccc84b6f18baeaa7a6bfe72c9606 100644 (file)
@@ -277,6 +277,8 @@ public final class EditorTabbedContainer implements Disposable, CloseAction.Clos
     myTabs.getTabAt(index).setTooltipText(text);
   }
 
+  public boolean isTitleShortened(int index) { return myTabs.getTabAt(index).isTitleShortened(); }
+
   public void setBackgroundColorAt(final int index, final Color color) {
     myTabs.getTabAt(index).setTabColor(color);
   }
index 14b2afe16345aa07044808b099f9554dd2879bd7..06a3966ade1d04ce15b1dcbe3161fe507425427c 100644 (file)
@@ -464,6 +464,10 @@ public class EditorWindow {
     }
   }
 
+  private boolean isTitleShortenedAt(int index) {
+    return myTabbedPane != null && myTabbedPane.isTitleShortened(index);
+  }
+
   private void setBackgroundColorAt(final int index, final Color color) {
     if (myTabbedPane != null) {
       myTabbedPane.setBackgroundColorAt(index, color);
@@