diff --git a/images/src/org/intellij/images/editor/ImageEditor.java b/images/src/org/intellij/images/editor/ImageEditor.java index 7d235be5d24c..a888961b8af0 100644 --- a/images/src/org/intellij/images/editor/ImageEditor.java +++ b/images/src/org/intellij/images/editor/ImageEditor.java @@ -18,8 +18,8 @@ package org.intellij.images.editor; import com.intellij.openapi.Disposable; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileListener; import org.intellij.images.ui.ImageComponentDecorator; -import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -28,13 +28,9 @@ import javax.swing.*; * * @author Alexey Efimov */ -public interface ImageEditor extends Disposable, ImageComponentDecorator { - - @Nullable +public interface ImageEditor extends Disposable, VirtualFileListener, ImageComponentDecorator { VirtualFile getFile(); - long getFileLength(); - Project getProject(); ImageDocument getDocument(); diff --git a/images/src/org/intellij/images/editor/impl/ImageEditorImpl.java b/images/src/org/intellij/images/editor/impl/ImageEditorImpl.java index 658f7803bc89..11319e33440a 100644 --- a/images/src/org/intellij/images/editor/impl/ImageEditorImpl.java +++ b/images/src/org/intellij/images/editor/impl/ImageEditorImpl.java @@ -17,15 +17,16 @@ package org.intellij.images.editor.impl; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; -import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.*; import org.intellij.images.editor.ImageDocument; import org.intellij.images.editor.ImageEditor; import org.intellij.images.editor.ImageZoomModel; +import org.intellij.images.fileTypes.ImageFileTypeManager; import org.intellij.images.options.*; import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActions; import org.intellij.images.ui.ImageComponent; +import org.intellij.images.vfs.IfsUtil; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; @@ -38,69 +39,58 @@ import java.beans.PropertyChangeListener; * * @author Alexey Efimov */ -class ImageEditorImpl implements ImageEditor { - private final PropertyChangeListener optionsChangeListener = new OptionsChangeListener(); - private final Project project; - private final ImageContentProvider contentProvider; - private final ImageEditorUI editorUI; - private boolean disposed; +final class ImageEditorImpl extends VirtualFileAdapter implements ImageEditor { + private final PropertyChangeListener optionsChangeListener = new OptionsChangeListener(); + private final Project project; + private final VirtualFile file; + private final ImageEditorUI editorUI; + private boolean disposed; - ImageEditorImpl(@NotNull Project project, @NotNull final ImageContentProvider contentProvider) { - this.project = project; - this.contentProvider = contentProvider; + ImageEditorImpl(@NotNull Project project, @NotNull VirtualFile file) { + this.project = project; + this.file = file; - // Options - Options options = OptionsManager.getInstance().getOptions(); - editorUI = new ImageEditorUI(this, options.getEditorOptions()); - options.addPropertyChangeListener(optionsChangeListener); - - contentProvider.addContentChangeListener(new ImageContentProvider.ContentChangeListener() { - public void contentChanged() { - setValue(contentProvider.getContent()); - } - }); - setValue(contentProvider.getContent()); - } - - private void setValue(ImageContentProvider.ImageContent content) { - ImageDocument document = editorUI.getImageComponent().getDocument(); - BufferedImage image = content.getImage(); - String format = content.getFormat(); - if (image != null && format != null) { - BufferedImage previousImage = document.getValue(); - document.setFormat(format); - document.setValue(image); - ImageZoomModel zoomModel = getZoomModel(); - if (previousImage == null || !zoomModel.isZoomLevelChanged()) { - // Set smart zooming behaviour on open + // Options Options options = OptionsManager.getInstance().getOptions(); - ZoomOptions zoomOptions = options.getEditorOptions().getZoomOptions(); - // Open as actual size - zoomModel.setZoomFactor(1.0d); + editorUI = new ImageEditorUI(this, options.getEditorOptions()); + options.addPropertyChangeListener(optionsChangeListener); - if (zoomOptions.isSmartZooming()) { - Dimension prefferedSize = zoomOptions.getPrefferedSize(); - if (prefferedSize.width > image.getWidth() && prefferedSize.height > image.getHeight()) { - // Resize to preferred size - // Calculate zoom factor + VirtualFileManager.getInstance().addVirtualFileListener(this); + + setValue(file); + } + + private void setValue(VirtualFile file) { + ImageDocument document = editorUI.getImageComponent().getDocument(); + try { + BufferedImage previousImage = document.getValue(); + BufferedImage image = IfsUtil.getImage(file); + document.setValue(image); + document.setFormat(IfsUtil.getFormat(file)); + ImageZoomModel zoomModel = getZoomModel(); + if (image != null && (previousImage == null || !zoomModel.isZoomLevelChanged())) { + // Set smart zooming behaviour on open + Options options = OptionsManager.getInstance().getOptions(); + ZoomOptions zoomOptions = options.getEditorOptions().getZoomOptions(); + // Open as actual size + zoomModel.setZoomFactor(1.0d); + + if (zoomOptions.isSmartZooming()) { + Dimension prefferedSize = zoomOptions.getPrefferedSize(); + if (prefferedSize.width > image.getWidth() && prefferedSize.height > image.getHeight()) { + // Resize to preffered size + // Calculate zoom factor double factor = (prefferedSize.getWidth() / (double) image.getWidth() + prefferedSize.getHeight() / (double) image.getHeight()) / 2.0d; - zoomModel.setZoomFactor(Math.ceil(factor)); - } + zoomModel.setZoomFactor(Math.ceil(factor)); + } + } + } + } catch (Exception e) { + // Error loading image file + document.setValue(null); } - } } - else { - document.setValue(null); - document.setFormat(null); - // Close editor - VirtualFile file = contentProvider.getVirtualFile(); - if (file != null) { - FileEditorManager editorManager = FileEditorManager.getInstance(project); - editorManager.closeFile(file); - } - } - } public boolean isValid() { ImageDocument document = editorUI.getImageComponent().getDocument(); @@ -115,14 +105,10 @@ class ImageEditorImpl implements ImageEditor { return editorUI.getImageComponent(); } - @Nullable - public VirtualFile getFile() { - return contentProvider.getVirtualFile(); - } - - public long getFileLength() { - return contentProvider.getFileLength(); - } + @NotNull + public VirtualFile getFile() { + return file; + } @NotNull public Project getProject() { @@ -168,9 +154,40 @@ class ImageEditorImpl implements ImageEditor { Options options = OptionsManager.getInstance().getOptions(); options.removePropertyChangeListener(optionsChangeListener); editorUI.dispose(); + VirtualFileManager.getInstance().removeVirtualFileListener(this); disposed = true; } + public void propertyChanged(VirtualFilePropertyEvent event) { + super.propertyChanged(event); + if (file.equals(event.getFile())) { + // Change document + file.refresh(true, false, new Runnable() { + public void run() { + if (ImageFileTypeManager.getInstance().isImage(file)) { + setValue(file); + } else { + setValue(null); + // Close editor + FileEditorManager editorManager = FileEditorManager.getInstance(project); + editorManager.closeFile(file); + } + } + }); + } + } + + public void contentsChanged(VirtualFileEvent event) { + super.contentsChanged(event); + if (file.equals(event.getFile())) { + // Change document + file.refresh(true, false, new Runnable() { + public void run() { + setValue(file); + } + }); + } + } private class OptionsChangeListener implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent evt) { diff --git a/images/src/org/intellij/images/editor/impl/ImageEditorManagerImpl.java b/images/src/org/intellij/images/editor/impl/ImageEditorManagerImpl.java index c23bcf88b709..815c09308e22 100644 --- a/images/src/org/intellij/images/editor/impl/ImageEditorManagerImpl.java +++ b/images/src/org/intellij/images/editor/impl/ImageEditorManagerImpl.java @@ -37,8 +37,8 @@ final class ImageEditorManagerImpl { * @return Image editor for file */ @NotNull - public static ImageEditor createImageEditor(@NotNull Project project, @NotNull ImageContentProvider contentProvider) { - return new ImageEditorImpl(project, contentProvider); + public static ImageEditor createImageEditor(@NotNull Project project, @NotNull VirtualFile file) { + return new ImageEditorImpl(project, file); } /** diff --git a/images/src/org/intellij/images/editor/impl/ImageEditorUI.java b/images/src/org/intellij/images/editor/impl/ImageEditorUI.java index a69670533b75..c4f80c1742cf 100644 --- a/images/src/org/intellij/images/editor/impl/ImageEditorUI.java +++ b/images/src/org/intellij/images/editor/impl/ImageEditorUI.java @@ -152,10 +152,11 @@ final class ImageEditorUI extends JPanel implements DataProvider { } else { format = format.toUpperCase(); } + VirtualFile file = editor.getFile(); infoLabel.setText( ImagesBundle.message("image.info", image.getWidth(), image.getHeight(), format, - colorModel.getPixelSize(), StringUtil.formatFileSize(editor.getFileLength()))); + colorModel.getPixelSize(), file != null ? StringUtil.formatFileSize(file.getLength()) : "")); } else { infoLabel.setText(null); } @@ -347,8 +348,7 @@ final class ImageEditorUI extends JPanel implements DataProvider { } else if (PlatformDataKeys.VIRTUAL_FILE.is(dataId)) { return editor.getFile(); } else if (PlatformDataKeys.VIRTUAL_FILE_ARRAY.is(dataId)) { - final VirtualFile file = editor.getFile(); - return file != null ? new VirtualFile[]{file} : null; + return new VirtualFile[]{editor.getFile()}; } else if (LangDataKeys.PSI_FILE.is(dataId)) { return getData(LangDataKeys.PSI_ELEMENT.getName()); } else if (LangDataKeys.PSI_ELEMENT.is(dataId)) { diff --git a/images/src/org/intellij/images/editor/impl/ImageFileEditorImpl.java b/images/src/org/intellij/images/editor/impl/ImageFileEditorImpl.java index 97af3feb9371..be3c13575781 100644 --- a/images/src/org/intellij/images/editor/impl/ImageFileEditorImpl.java +++ b/images/src/org/intellij/images/editor/impl/ImageFileEditorImpl.java @@ -22,6 +22,8 @@ import com.intellij.openapi.fileEditor.FileEditorState; import com.intellij.openapi.fileEditor.FileEditorStateLevel; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.UserDataHolderBase; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; import org.intellij.images.editor.ImageEditor; import org.intellij.images.editor.ImageFileEditor; import org.intellij.images.editor.ImageZoomModel; @@ -43,8 +45,11 @@ final class ImageFileEditorImpl extends UserDataHolderBase implements ImageFileE private static final String NAME = "ImageFileEditor"; private final ImageEditor imageEditor; - ImageFileEditorImpl(@NotNull Project project, @NotNull ImageContentProvider contentProvider) { - imageEditor = ImageEditorManagerImpl.createImageEditor(project, contentProvider); + ImageFileEditorImpl(@NotNull Project project, @NotNull VirtualFile file) { + imageEditor = ImageEditorManagerImpl.createImageEditor(project, file); + + // Append file listener + VirtualFileManager.getInstance().addVirtualFileListener(imageEditor); // Set background and grid default options Options options = OptionsManager.getInstance().getOptions(); @@ -121,6 +126,7 @@ final class ImageFileEditorImpl extends UserDataHolderBase implements ImageFileE } public void dispose() { + VirtualFileManager.getInstance().removeVirtualFileListener(imageEditor); ImageEditorManagerImpl.releaseImageEditor(imageEditor); } diff --git a/images/src/org/intellij/images/editor/impl/ImageFileEditorProvider.java b/images/src/org/intellij/images/editor/impl/ImageFileEditorProvider.java index 88e89eef1957..da0f8f1c9a56 100644 --- a/images/src/org/intellij/images/editor/impl/ImageFileEditorProvider.java +++ b/images/src/org/intellij/images/editor/impl/ImageFileEditorProvider.java @@ -30,7 +30,7 @@ import org.jetbrains.annotations.NotNull; * * @author Alexey Efimov */ -public final class ImageFileEditorProvider implements FileEditorProvider, DumbAware { +final class ImageFileEditorProvider implements FileEditorProvider, DumbAware { @NonNls private static final String EDITOR_TYPE_ID = "images"; private final ImageFileTypeManager typeManager; @@ -45,14 +45,7 @@ public final class ImageFileEditorProvider implements FileEditorProvider, DumbAw @NotNull public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) { - return createImageEditor(project, new VirtualFileImageContentProvider(file)); - } - - @NotNull - public static FileEditor createImageEditor(@NotNull Project project, @NotNull ImageContentProvider contentProvider) { - ImageFileEditorImpl editor = new ImageFileEditorImpl(project, contentProvider); - Disposer.register(editor, contentProvider); - return editor; + return new ImageFileEditorImpl(project, file); } public void disposeEditor(@NotNull FileEditor editor) { diff --git a/images/src/org/intellij/images/editor/impl/VirtualFileImageContentProvider.java b/images/src/org/intellij/images/editor/impl/VirtualFileImageContentProvider.java deleted file mode 100644 index cb7f8894aa49..000000000000 --- a/images/src/org/intellij/images/editor/impl/VirtualFileImageContentProvider.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2000-2011 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 org.intellij.images.editor.impl; - -import com.intellij.openapi.vfs.*; -import com.intellij.util.EventDispatcher; -import org.intellij.images.fileTypes.ImageFileTypeManager; -import org.intellij.images.vfs.IfsUtil; -import org.jetbrains.annotations.Nullable; - -import java.awt.image.BufferedImage; -import java.io.IOException; - -/** -* User: ksafonov -*/ -class VirtualFileImageContentProvider extends VirtualFileAdapter implements ImageContentProvider { - private final VirtualFile myFile; - private final EventDispatcher myEventDispatcher = EventDispatcher.create(ContentChangeListener.class); - - private static final ImageContent NULL_CONTENT = new ImageContent() { - public BufferedImage getImage() { - return null; - } - - public String getFormat() { - return null; - } - }; - - public VirtualFileImageContentProvider(final VirtualFile virtualFile) { - myFile = virtualFile; - VirtualFileManager.getInstance().addVirtualFileListener(this); - } - - public ImageContent getContent() { - if (ImageFileTypeManager.getInstance().isImage(myFile)) { - return new ImageContent() { - @Nullable - public BufferedImage getImage() { - try { - return IfsUtil.getImage(myFile); - } - catch (IOException e) { - return null; - } - } - - @Nullable - public String getFormat() { - try { - return IfsUtil.getFormat(myFile); - } - catch (IOException e) { - return null; - } - } - }; - } - else { - return NULL_CONTENT; - } - } - - public void addContentChangeListener(final ContentChangeListener listener) { - myEventDispatcher.addListener(listener, this); - } - - public VirtualFile getVirtualFile() { - return myFile; - } - - public long getFileLength() { - return myFile.getLength(); - } - - public void dispose() { - VirtualFileManager.getInstance().removeVirtualFileListener(this); - } - - public void propertyChanged(VirtualFilePropertyEvent event) { - onFileChange(event); - } - - public void contentsChanged(VirtualFileEvent event) { - onFileChange(event); - } - - private void onFileChange(final VirtualFileEvent event) { - if (myFile.equals(event.getFile())) { - // Change document - myFile.refresh(true, false, new Runnable() { - public void run() { - myEventDispatcher.getMulticaster().contentChanged(); - } - }); - } - } -} diff --git a/images/src/org/intellij/images/vfs/IfsUtil.java b/images/src/org/intellij/images/vfs/IfsUtil.java index 085dff211cc1..8e67e3f6de9d 100644 --- a/images/src/org/intellij/images/vfs/IfsUtil.java +++ b/images/src/org/intellij/images/vfs/IfsUtil.java @@ -27,7 +27,6 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.reference.SoftReference; import com.intellij.util.LogicalRoot; import com.intellij.util.LogicalRootsManager; -import com.intellij.util.PairConsumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -58,21 +57,34 @@ public final class IfsUtil { * @return true if file image is loaded. * @throws java.io.IOException if image can not be loaded */ - private static boolean refresh(@NotNull final VirtualFile file) throws IOException { + private static boolean refresh(@NotNull VirtualFile file) throws IOException { Long loadedTimeStamp = file.getUserData(TIMESTAMP_KEY); SoftReference imageRef = file.getUserData(BUFFERED_IMAGE_REF_KEY); if (loadedTimeStamp == null || loadedTimeStamp.longValue() != file.getTimeStamp() || imageRef == null || imageRef.get() == null) { try { final byte[] content = file.contentsToByteArray(); - final boolean loaded = processBytes(content, new PairConsumer() { - public void consume(final String formatName, final BufferedImage image) { - file.putUserData(FORMAT_KEY, formatName); - file.putUserData(BUFFERED_IMAGE_REF_KEY, new SoftReference(image)); + InputStream inputStream = new ByteArrayInputStream(content, 0, content.length); + ImageInputStream imageInputStream = ImageIO.createImageInputStream(inputStream); + try { + Iterator imageReaders = ImageIO.getImageReaders(imageInputStream); + if (imageReaders.hasNext()) { + ImageReader imageReader = imageReaders.next(); + try { + file.putUserData(FORMAT_KEY, imageReader.getFormatName()); + ImageReadParam param = imageReader.getDefaultReadParam(); + imageReader.setInput(imageInputStream, true, true); + int minIndex = imageReader.getMinIndex(); + BufferedImage image = imageReader.read(minIndex, param); + file.putUserData(BUFFERED_IMAGE_REF_KEY, new SoftReference(image)); + return true; + } finally { + imageReader.dispose(); + } } - }); - if (loaded) return true; - } - finally { + } finally { + imageInputStream.close(); + } + } finally { // We perform loading no more needed file.putUserData(TIMESTAMP_KEY, file.getTimeStamp()); } @@ -80,33 +92,6 @@ public final class IfsUtil { return false; } - public static boolean processBytes(final byte[] content, PairConsumer consumer) throws IOException { - InputStream inputStream = new ByteArrayInputStream(content, 0, content.length); - ImageInputStream imageInputStream = ImageIO.createImageInputStream(inputStream); - try { - Iterator imageReaders = ImageIO.getImageReaders(imageInputStream); - if (imageReaders.hasNext()) { - ImageReader imageReader = imageReaders.next(); - try { - final String formatName = imageReader.getFormatName(); - ImageReadParam param = imageReader.getDefaultReadParam(); - imageReader.setInput(imageInputStream, true, true); - int minIndex = imageReader.getMinIndex(); - BufferedImage image = imageReader.read(minIndex, param); - consumer.consume(formatName, image); - return true; - } - finally { - imageReader.dispose(); - } - } - } - finally { - imageInputStream.close(); - } - return false; - } - @Nullable public static BufferedImage getImage(@NotNull VirtualFile file) throws IOException { refresh(file); diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/CompAPIDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/CompAPIDriver.java index 49a467b5cffc..39d8996e296a 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/CompAPIDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/CompAPIDriver.java @@ -16,9 +16,12 @@ package com.intellij.compiler.impl.javaCompiler.api; import com.intellij.compiler.OutputParser; -import com.sun.source.util.*; +import com.sun.source.util.JavacTask; +import com.sun.source.util.TaskEvent; +import com.sun.source.util.TaskListener; import com.sun.tools.javac.api.JavacTool; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.tools.*; import java.io.File; @@ -49,8 +52,11 @@ class CompAPIDriver { private volatile boolean compiling; private static final PrintWriter COMPILER_ERRORS = new PrintWriter(System.err); + @Nullable + private final String mySourcesEncoding; - CompAPIDriver() { + CompAPIDriver(@Nullable String sourcesEncoding) { + mySourcesEncoding = sourcesEncoding; } public void compile(List commandLine, List paths, final String outputDir) { @@ -60,7 +66,7 @@ class CompAPIDriver { assert myCompilationResults.isEmpty(); JavaCompiler compiler = JavacTool.create(); //use current classloader StandardJavaFileManager standardFileManager = compiler.getStandardFileManager(null, null, null); - MyFileManager manager = new MyFileManager(this, outputDir, standardFileManager); + MyFileManager manager = new MyFileManager(this, outputDir, standardFileManager, mySourcesEncoding); Iterable input = manager.getJavaFileObjectsFromFiles(paths); diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/CompilerAPICompiler.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/CompilerAPICompiler.java index 63c3186a5db1..e26b8de22f37 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/CompilerAPICompiler.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/CompilerAPICompiler.java @@ -141,13 +141,27 @@ public class CompilerAPICompiler implements BackendCompiler { private final ModuleChunk myChunk; private final String myOutputDir; private final CompileContext myCompileContext; - private final CompAPIDriver myCompAPIDriver = new CompAPIDriver(); + private final CompAPIDriver myCompAPIDriver; private MyProcess(List commandLine, ModuleChunk chunk, String outputDir, CompileContext compileContext) { myCommandLine = commandLine; myChunk = chunk; myOutputDir = outputDir; myCompileContext = compileContext; + myCompAPIDriver = new CompAPIDriver(findEncodingValue(commandLine)); + } + + private static String findEncodingValue(List commandLine) { + boolean found = false; + for (String param : commandLine) { + if (found) { + return param; + } + if ("-encoding".equalsIgnoreCase(param)) { + found = true; + } + } + return null; } public OutputStream getOutputStream() { diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/JavaIoFile.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/JavaIoFile.java index a937d9ce5322..c0e03bf8af7a 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/JavaIoFile.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/JavaIoFile.java @@ -16,8 +16,10 @@ package com.intellij.compiler.impl.javaCompiler.api; import com.intellij.openapi.util.io.FileUtil; +import org.jetbrains.annotations.Nullable; -import javax.tools.*; +import javax.tools.JavaFileObject; +import javax.tools.SimpleJavaFileObject; import java.io.*; /** @@ -26,15 +28,18 @@ import java.io.*; @SuppressWarnings({"Since15"}) class JavaIoFile extends SimpleJavaFileObject { private final File myFile; + @Nullable + private final String myEncoding; - JavaIoFile(File file, Kind kind) { + JavaIoFile(File file, Kind kind, @Nullable String encoding) { super(file.toURI(), kind); myFile = file; + myEncoding = encoding; } @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { - return FileUtil.loadFile(myFile); + return FileUtil.loadFile(myFile, myEncoding); } @Override diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/MyFileManager.java b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/MyFileManager.java index 2fd54d176620..8da3c0d46fe3 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/MyFileManager.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/javaCompiler/api/MyFileManager.java @@ -26,7 +26,9 @@ import com.sun.tools.javac.util.ListBuffer; import gnu.trove.THashSet; import gnu.trove.TObjectHashingStrategy; -import javax.tools.*; +import javax.tools.FileObject; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; import java.io.File; import java.io.IOException; import java.net.URI; @@ -40,12 +42,14 @@ class MyFileManager implements StandardJavaFileManager { private final String myOutputDir; private final StandardJavaFileManager myStandardFileManager; + private final String myEncoding; private final CompAPIDriver myCompAPIDriver; - MyFileManager(CompAPIDriver compAPIDriver, String outputDir, StandardJavaFileManager standardFileManager) { + MyFileManager(CompAPIDriver compAPIDriver, String outputDir, StandardJavaFileManager standardFileManager, String encoding) { myCompAPIDriver = compAPIDriver; myOutputDir = outputDir; myStandardFileManager = standardFileManager; + myEncoding = encoding; } @Override @@ -54,7 +58,7 @@ class MyFileManager implements StandardJavaFileManager { List result = new ArrayList(size); for (File file : files) { - JavaFileObject fileObject = new JavaIoFile(file, JavaFileObject.Kind.SOURCE); + JavaFileObject fileObject = new JavaIoFile(file, JavaFileObject.Kind.SOURCE, myEncoding); result.add(fileObject); } @@ -119,7 +123,7 @@ class MyFileManager implements StandardJavaFileManager { if (kind == JavaFileObject.Kind.SOURCE && child.getFileSystem() instanceof JarFileSystem) continue; //for some reasdon javac looks for java files inside jar // use VFS to read content inside .jar - JavaFileObject fileObject = !child.getPath().contains("!/") ? new JavaIoFile(new File(child.getPath()), kind) : new JavaVirtualFile(child, kind); + JavaFileObject fileObject = !child.getPath().contains("!/") ? new JavaIoFile(new File(child.getPath()), kind, myEncoding) : new JavaVirtualFile(child, kind); results.add(fileObject); } } diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java index 891d2b3c9135..0cb9987c79e7 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java @@ -48,6 +48,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { private JCheckBox myCbHideNullArrayElements; private JCheckBox myCbShowStatic; private JCheckBox myCbShowDeclaredType; + private JCheckBox myCbShowFQNames; private JCheckBox myCbShowObjectId; private StateRestoringCheckBox myCbShowStaticFinalFields; @@ -102,6 +103,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { } }); myCbShowDeclaredType = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.declared.type")); + myCbShowFQNames = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.fq.names")); myCbShowObjectId = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.object.id")); myCbEnableToString = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.enable.tostring")); @@ -149,7 +151,8 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { showPanel.add(myCbShowObjectId, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0)); showPanel.add(myCbShowSyntheticFields, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0)); showPanel.add(myCbShowStatic, new GridBagConstraints(1, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 10, 0, 0), 0, 0)); - showPanel.add(myCbShowStaticFinalFields, new GridBagConstraints(2, 1, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 10, 0, 0), 0, 0)); + showPanel.add(myCbShowStaticFinalFields, new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 10, 0, 0), 0, 0)); + showPanel.add(myCbShowFQNames, new GridBagConstraints(3, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 10, 0, 0), 0, 0)); panel.add(showPanel, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(4, 0, 0, 0), 0, 0)); @@ -193,6 +196,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { classRenderer.SHOW_STATIC_FINAL = myCbShowStaticFinalFields.isSelectedWhenSelectable(); classRenderer.SHOW_SYNTHETICS = myCbShowSyntheticFields.isSelected(); classRenderer.SHOW_DECLARED_TYPE = myCbShowDeclaredType.isSelected(); + classRenderer.SHOW_FQ_TYPE_NAMES = myCbShowFQNames.isSelected(); classRenderer.SHOW_OBJECT_ID = myCbShowObjectId.isSelected(); final ToStringRenderer toStringRenderer = rendererSettings.getToStringRenderer(); @@ -226,6 +230,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { myCbShowStaticFinalFields.makeUnselectable(false); } myCbShowDeclaredType.setSelected(classRenderer.SHOW_DECLARED_TYPE); + myCbShowFQNames.setSelected(classRenderer.SHOW_FQ_TYPE_NAMES); myCbShowObjectId.setSelected(classRenderer.SHOW_OBJECT_ID); final ToStringRenderer toStringRenderer = rendererSettings.getToStringRenderer(); @@ -275,6 +280,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable { (classRenderer.SHOW_STATIC_FINAL != myCbShowStaticFinalFields.isSelectedWhenSelectable()) || (classRenderer.SHOW_SYNTHETICS != myCbShowSyntheticFields.isSelected()) || (classRenderer.SHOW_DECLARED_TYPE != myCbShowDeclaredType.isSelected()) || + (classRenderer.SHOW_FQ_TYPE_NAMES != myCbShowFQNames.isSelected()) || (classRenderer.SHOW_OBJECT_ID != myCbShowObjectId.isSelected()); if (isClassRendererModified) { return true; diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/FieldDescriptorImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/FieldDescriptorImpl.java index 12911d980dbb..ea8fabf23e1d 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/FieldDescriptorImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/FieldDescriptorImpl.java @@ -158,7 +158,7 @@ public class FieldDescriptorImpl extends ValueDescriptorImpl implements FieldDes buf.append(getName()); if (classRenderer.SHOW_DECLARED_TYPE) { buf.append(": "); - buf.append(myField.typeName()); + buf.append(classRenderer.renderTypeName(myField.typeName())); } return buf.toString(); } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/LocalVariableDescriptorImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/LocalVariableDescriptorImpl.java index 582c15e00181..96f0dc6ff61f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/LocalVariableDescriptorImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/LocalVariableDescriptorImpl.java @@ -121,7 +121,7 @@ public class LocalVariableDescriptorImpl extends ValueDescriptorImpl implements buf.append(getName()); if (classRenderer.SHOW_DECLARED_TYPE) { buf.append(": "); - buf.append(myTypeName); + buf.append(classRenderer.renderTypeName(myTypeName)); } return buf.toString(); } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/StaticDescriptorImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/StaticDescriptorImpl.java index 910c5dd1e7e1..6284de46b724 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/StaticDescriptorImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/StaticDescriptorImpl.java @@ -23,7 +23,9 @@ package com.intellij.debugger.ui.impl.watch; import com.intellij.debugger.engine.DebuggerManagerThreadImpl; import com.intellij.debugger.engine.evaluation.EvaluateException; import com.intellij.debugger.engine.evaluation.EvaluationContextImpl; +import com.intellij.debugger.settings.NodeRendererSettings; import com.intellij.debugger.ui.tree.StaticDescriptor; +import com.intellij.debugger.ui.tree.render.ClassRenderer; import com.intellij.debugger.ui.tree.render.DescriptorLabelListener; import com.sun.jdi.Field; import com.sun.jdi.ReferenceType; @@ -64,6 +66,7 @@ public class StaticDescriptorImpl extends NodeDescriptorImpl implements StaticDe protected String calcRepresentation(EvaluationContextImpl context, DescriptorLabelListener descriptorLabelListener) throws EvaluateException { DebuggerManagerThreadImpl.assertIsManagerThread(); - return getName() + " = " + myType.name(); + final ClassRenderer classRenderer = NodeRendererSettings.getInstance().getClassRenderer(); + return getName() + " = " + classRenderer.renderTypeName(myType.name()); } } \ No newline at end of file diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/UserExpressionDescriptorImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/UserExpressionDescriptorImpl.java index 7f844f067aa6..c3dbed6c7fbb 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/UserExpressionDescriptorImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/UserExpressionDescriptorImpl.java @@ -27,7 +27,9 @@ import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil; import com.intellij.debugger.engine.evaluation.EvaluationContextImpl; import com.intellij.debugger.engine.evaluation.TextWithImports; import com.intellij.debugger.impl.DebuggerUtilsEx; +import com.intellij.debugger.settings.NodeRendererSettings; import com.intellij.debugger.ui.tree.UserExpressionDescriptor; +import com.intellij.debugger.ui.tree.render.ClassRenderer; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiCodeFragment; @@ -57,8 +59,10 @@ public class UserExpressionDescriptorImpl extends EvaluationDescriptor implement try { buffer.append(getName()); buffer.append(": "); - if(getValue() != null) { - buffer.append(getValue().type().name()); + final Value value = getValue(); + if(value != null) { + final ClassRenderer classRenderer = NodeRendererSettings.getInstance().getClassRenderer(); + buffer.append(classRenderer.renderTypeName(value.type().name())); } return buffer.toString(); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ValueDescriptorImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ValueDescriptorImpl.java index 78fea931e6c9..3694dbb7cde7 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ValueDescriptorImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/ValueDescriptorImpl.java @@ -378,7 +378,7 @@ public abstract class ValueDescriptorImpl extends NodeDescriptorImpl implements if (showConcreteType || classRenderer.SHOW_OBJECT_ID) { buf.append('{'); if (showConcreteType) { - buf.append(objRef.type().name()); + buf.append(classRenderer.renderTypeName(objRef.type().name())); } if (classRenderer.SHOW_OBJECT_ID) { buf.append('@'); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java index fcbbbc32b3dd..aecc129a7ac1 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/tree/render/ClassRenderer.java @@ -63,6 +63,7 @@ public class ClassRenderer extends NodeRendererImpl{ public boolean SHOW_STATIC = false; public boolean SHOW_STATIC_FINAL = false; + public boolean SHOW_FQ_TYPE_NAMES = true; public boolean SHOW_DECLARED_TYPE = false; public boolean SHOW_OBJECT_ID = true; @@ -70,6 +71,17 @@ public class ClassRenderer extends NodeRendererImpl{ myProperties.setEnabled(true); } + public final String renderTypeName(final String typeName) { + if (SHOW_FQ_TYPE_NAMES) { + return typeName; + } + final int dotIndex = typeName.lastIndexOf('.'); + if (dotIndex > 0) { + return typeName.substring(dotIndex + 1); + } + return typeName; + } + public String getUniqueId() { return UNIQUE_ID; } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetStructureConfigurable.java index f6d27512cb7f..97bfa377a2b3 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetStructureConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetStructureConfigurable.java @@ -36,6 +36,7 @@ import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStr import com.intellij.openapi.ui.DetailsComponent; import com.intellij.openapi.ui.NamedConfigurable; import com.intellij.openapi.util.IconLoader; +import com.intellij.ui.treeStructure.filtered.FilteringTreeBuilder; import com.intellij.util.ui.tree.TreeUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -43,6 +44,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; import java.util.*; import java.util.List; @@ -55,6 +58,7 @@ public class FacetStructureConfigurable extends BaseStructureConfigurable { private final Map, FacetTypeEditor> myFacetTypeEditors = new HashMap, FacetTypeEditor>(); private MultipleFacetSettingsEditor myCurrentMultipleSettingsEditor; @NonNls private static final String NO_FRAMEWORKS_NODE = "No facets are configured"; + private boolean myTreeWasInitialized; public FacetStructureConfigurable(final Project project, ModuleManager moduleManager) { super(project); @@ -77,7 +81,30 @@ public class FacetStructureConfigurable extends BaseStructureConfigurable { @Override protected void initTree() { super.initTree(); - myTree.setCellRenderer(new FacetsTreeCellRenderer()); + if (!myTreeWasInitialized) { + myTreeWasInitialized = true; + myTree.setCellRenderer(new FacetsTreeCellRenderer()); + myTree.addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + revalidateTree(); + } + + @Override + public void componentMoved(ComponentEvent e) { + revalidateTree(); + } + + @Override + public void componentShown(ComponentEvent e) { + revalidateTree(); + } + }); + } + } + + private void revalidateTree() { + FilteringTreeBuilder.revalidateTree(myTree); } protected void loadTree() { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetsTreeCellRenderer.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetsTreeCellRenderer.java index 2bfd614f8aa1..53ef207663eb 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetsTreeCellRenderer.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/FacetsTreeCellRenderer.java @@ -56,8 +56,8 @@ public class FacetsTreeCellRenderer extends GroupedElementsRenderer.Tree impleme final Icon icon = configurable.getIcon(expanded); final boolean showSeparator = configurable instanceof FrameworkDetectionConfigurable; int width = -1; - if (showSeparator) { - final int treeWidth = tree.getSize().width; + if (showSeparator && tree.isVisible()) { + final int treeWidth = tree.getVisibleRect().width - 4; if (treeWidth > 0) { width = treeWidth; } diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy index f91c7fe5dae8..2c4f96beb193 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy @@ -634,6 +634,27 @@ public interface Test { assert !lookup } + public void testNoSingleTemplateLookup() { + myFixture.configureByText 'a.java', 'class Foo {{ ite }}' + type 'r' + assert !lookup + } + + public void testTemplatesWithNonImportedClasses() { + CodeInsightSettings.instance.COMPLETION_CASE_SENSITIVE = CodeInsightSettings.NONE + myFixture.addClass("package foo.bar; public class LayoutStore {}") + try { + myFixture.configureByText 'a.java', 'class Foo {{ foo() }}' + type 'lst' + assert lookup + assert 'lst' in myFixture.lookupElementStrings + assert 'LayoutStore' in myFixture.lookupElementStrings + } + finally { + CodeInsightSettings.instance.COMPLETION_CASE_SENSITIVE = CodeInsightSettings.FIRST_LETTER + } + } + public void testTemplateSelectionByComma() { myFixture.configureByText("a.java", """ class Foo { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/CodeInsightSettings.java b/platform/lang-impl/src/com/intellij/codeInsight/CodeInsightSettings.java index a58cb1000e72..2d2ae032c7f2 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/CodeInsightSettings.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/CodeInsightSettings.java @@ -16,12 +16,10 @@ package com.intellij.codeInsight; -import com.intellij.openapi.application.ConfigImportHelper; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.util.ArrayUtil; -import com.intellij.util.containers.hash.HashSet; import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters; import com.intellij.util.xmlb.XmlSerializationException; import com.intellij.util.xmlb.XmlSerializer; @@ -33,9 +31,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; @State( @@ -148,32 +143,6 @@ public class CodeInsightSettings implements PersistentStateComponent, C catch (XmlSerializationException e) { LOG.info(e); } - - // TODO den remove when IJ v.11 is released. - // 1. Old default value for 'reformat on paste' setting was 'indent block'; - // 2. 'Indent block' processing was corrected and it requires copied text to include first line indent in order for correct processing; - // 3. Many of our users don't include first line's indent to the copied text. That's why 'indent each line' was set as default; - // 4. We had a problem that code insight settings with default values were stored to a hdd. So, new default value will not - // be automatically applied; - // 5. That's why we explicitly set 'indent block's value to 'indent each line' if detect that this is the first line of IJ v.11; - if (Boolean.getBoolean(ConfigImportHelper.CONFIG_IMPORTED_IN_CURRENT_SESSION_KEY)) { - REFORMAT_ON_PASTE = INDENT_EACH_LINE; - } - - // TODO den remove this at 2012 (if we're still alive) - // There was a problem that 'exclude package' settings were written multiple times. The code below removes the duplicates. - // The problem is not included to the release version, so, we can have that filtering logic for a time that is enough for - // removing the duplicate across IJ team machines. It may be safely removed after that. - List result = new ArrayList(); - Set buffer = new HashSet(); - for (String s : EXCLUDED_PACKAGES) { - if (buffer.add(s)) { - result.add(s); - } - } - if (result.size() < EXCLUDED_PACKAGES.length) { - EXCLUDED_PACKAGES = result.toArray(new String[result.size()]); - } } public Element getState() { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java index 1d7a85c4c861..89f80018dbb3 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java @@ -25,6 +25,7 @@ import com.intellij.codeInsight.hint.EditorHintListener; import com.intellij.codeInsight.hint.HintManager; import com.intellij.codeInsight.lookup.*; import com.intellij.codeInsight.lookup.impl.LookupImpl; +import com.intellij.codeInsight.template.impl.LiveTemplateLookupElement; import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.injected.editor.DocumentWindow; import com.intellij.injected.editor.EditorWindow; @@ -511,7 +512,7 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement return false; } - if (item.isValid()) { + if (item.isValid() && !(item instanceof LiveTemplateLookupElement)) { final LookupElementPresentation presentation = new LookupElementPresentation(); item.renderElement(presentation); if (StringUtil.isNotEmpty(presentation.getTailText())) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ListTemplatesHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ListTemplatesHandler.java index 6831a726575d..7ce8a60063e8 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ListTemplatesHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ListTemplatesHandler.java @@ -29,6 +29,7 @@ import com.intellij.openapi.command.WriteCommandAction; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ex.util.EditorUtil; +import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; @@ -40,7 +41,9 @@ import java.util.Map; public class ListTemplatesHandler implements CodeInsightActionHandler { public void invoke(@NotNull final Project project, @NotNull final Editor editor, @NotNull PsiFile file) { - if (!file.isWritable()) return; + if (!FileDocumentManager.getInstance().requestWriting(editor.getDocument(), project)) { + return; + } EditorUtil.fillVirtualSpaceUntilCaret(editor); PsiDocumentManager.getInstance(project).commitDocument(editor.getDocument()); diff --git a/platform/lang-impl/src/com/intellij/injected/editor/FoldingModelWindow.java b/platform/lang-impl/src/com/intellij/injected/editor/FoldingModelWindow.java index b5e07713469d..638d21dc6647 100644 --- a/platform/lang-impl/src/com/intellij/injected/editor/FoldingModelWindow.java +++ b/platform/lang-impl/src/com/intellij/injected/editor/FoldingModelWindow.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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. @@ -118,6 +118,11 @@ public class FoldingModelWindow implements FoldingModelEx{ myDelegate.runBatchFoldingOperation(operation); } + @Override + public void runBatchFoldingOperation(@NotNull Runnable operation, boolean moveCaretFromCollapsedRegion) { + myDelegate.runBatchFoldingOperation(operation, moveCaretFromCollapsedRegion); + } + @Override public void runBatchFoldingOperationDoNotCollapseCaret(@NotNull Runnable operation) { myDelegate.runBatchFoldingOperationDoNotCollapseCaret(operation); diff --git a/platform/platform-api/src/com/intellij/ide/GeneralSettings.java b/platform/platform-api/src/com/intellij/ide/GeneralSettings.java index 3fb9b07e514e..65fffab3d2d3 100644 --- a/platform/platform-api/src/com/intellij/ide/GeneralSettings.java +++ b/platform/platform-api/src/com/intellij/ide/GeneralSettings.java @@ -222,6 +222,8 @@ public class GeneralSettings implements NamedJDOMExternalizable, ExportableAppli //todo use DefaultExternalizer public void readExternal(Element parentNode) { + boolean safeWriteSettingRead = false; + List children = parentNode.getChildren(ELEMENT_OPTION); for (final Object aChildren : children) { Element element = (Element)aChildren; @@ -295,6 +297,7 @@ public class GeneralSettings implements NamedJDOMExternalizable, ExportableAppli } if (OPTION_USE_SAFE_WRITE.equals(name) && value != null) { myUseSafeWrite = Boolean.valueOf(value).booleanValue(); + safeWriteSettingRead = true; } if (OPTION_CHARSET.equals(name)) { @@ -361,6 +364,10 @@ public class GeneralSettings implements NamedJDOMExternalizable, ExportableAppli } } } + + if (!safeWriteSettingRead && "true".equals(System.getProperty("idea.no.safe.write"))) { + myUseSafeWrite = false; + } } public void writeExternal(Element parentNode) { diff --git a/platform/platform-api/src/com/intellij/openapi/editor/FoldingModel.java b/platform/platform-api/src/com/intellij/openapi/editor/FoldingModel.java index 47b760169793..586109c68146 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/FoldingModel.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/FoldingModel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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. @@ -64,6 +64,7 @@ public interface FoldingModel { */ boolean isOffsetCollapsed(int offset); + @Nullable FoldRegion getCollapsedRegionAtOffset(int offset); /** @@ -74,5 +75,15 @@ public interface FoldingModel { */ void runBatchFoldingOperation(@NotNull Runnable operation); + /** + * Runs an operation which is allowed to modify fold regions in the editor by calling + * {@link #addFoldRegion(int, int, String)} and {@link #removeFoldRegion(FoldRegion)}. + * + * @param operation the operation to execute. + * @param moveCaretFromCollapsedRegion flag that identifies whether caret position should be changed if it's located inside + * collapsed fold region after the operation + */ + void runBatchFoldingOperation(@NotNull Runnable operation, boolean moveCaretFromCollapsedRegion); + void runBatchFoldingOperationDoNotCollapseCaret(@NotNull Runnable operation); } diff --git a/platform/platform-api/src/com/intellij/openapi/editor/LogicalPosition.java b/platform/platform-api/src/com/intellij/openapi/editor/LogicalPosition.java index 703ebe1b5d1a..3afce0f163f7 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/LogicalPosition.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/LogicalPosition.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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. @@ -143,7 +143,10 @@ public class LogicalPosition implements Comparable { public String toString() { return "LogicalPosition: (" + line + ", " + column + ")" + (visualPositionAware ? "; vp aware" : "") - + (softWrapLinesBeforeCurrentLogicalLine + softWrapLinesOnCurrentLogicalLine == 0 ? "" : "; soft wrap: lines=" + (softWrapLinesBeforeCurrentLogicalLine + softWrapLinesOnCurrentLogicalLine) + " (before=" + softWrapLinesBeforeCurrentLogicalLine + "; current=" + softWrapLinesOnCurrentLogicalLine + ")") + + (softWrapLinesBeforeCurrentLogicalLine + softWrapLinesOnCurrentLogicalLine == 0 + ? "" + : "; soft wrap: lines=" + (softWrapLinesBeforeCurrentLogicalLine + softWrapLinesOnCurrentLogicalLine) + + " (before=" + softWrapLinesBeforeCurrentLogicalLine + "; current=" + softWrapLinesOnCurrentLogicalLine + ")") + (softWrapColumnDiff == 0 ? "" : "columns diff=" + softWrapColumnDiff + ";" ) + (foldedLines == 0? "" : " folding: lines = " + foldedLines + ";") + (foldingColumnDiff == 0 ? "" : " columns diff=" + foldingColumnDiff); diff --git a/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java b/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java index 943b5c893524..46251e891d77 100644 --- a/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java +++ b/platform/platform-api/src/com/intellij/ui/HyperlinkLabel.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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. @@ -41,8 +41,7 @@ import java.util.List; * @author Eugene Belyaev */ public class HyperlinkLabel extends HighlightableComponent { - private static final TextAttributes BOLD_ATTRIBUTES = - new TextAttributes(UIUtil.getLabelTextForeground(), UIUtil.getLabelBackground(), null, null, Font.BOLD); + private static final TextAttributes BOLD_ATTRIBUTES = new TextAttributes(UIUtil.getLabelTextForeground(), null, null, null, Font.BOLD); private static final Logger LOG = Logger.getInstance(HyperlinkLabel.class.getName()); diff --git a/platform/platform-api/src/com/intellij/ui/OptionalChooserComponent.java b/platform/platform-api/src/com/intellij/ui/OptionalChooserComponent.java index 520574581923..dbf4464ea373 100644 --- a/platform/platform-api/src/com/intellij/ui/OptionalChooserComponent.java +++ b/platform/platform-api/src/com/intellij/ui/OptionalChooserComponent.java @@ -73,6 +73,34 @@ public abstract class OptionalChooserComponent implements CheckBoxListListene return myList.getSelectedIndex(); } + public void setSelectedIndex(final int index) { + myList.setSelectedIndex(index); + } + + public boolean removeAt(final int index) { + getCurrentModel().remove(index); + refresh(); + + if (index < getCurrentModel().size()) { + setSelectedIndex(index); + return true; + } + else if (index > 0) { + setSelectedIndex(index - 1); + return true; + } + return false; + } + + public boolean removeSelected() { + final int selectedIndex = getSelectedIndex(); + // selected index + if (selectedIndex != -1) { + return removeAt(selectedIndex); + } + return false; + } + public boolean isModified() { return !myWorkingList.equals(myInitialList); } diff --git a/platform/platform-api/src/com/intellij/ui/components/JBViewport.java b/platform/platform-api/src/com/intellij/ui/components/JBViewport.java index c1f65c4561f9..0ab304d1ef13 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBViewport.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBViewport.java @@ -18,14 +18,16 @@ package com.intellij.ui.components; import com.intellij.ui.table.JBTable; import com.intellij.util.ui.ComponentWithEmptyText; import com.intellij.util.ui.StatusText; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.awt.event.ContainerEvent; import java.awt.event.ContainerListener; -public class JBViewport extends JViewport { +public class JBViewport extends JViewport implements ZoomableViewport { private StatusText myEmptyText; + private ZoomingDelegate myZoomer; public JBViewport() { addContainerListener(new ContainerListener() { @@ -50,16 +52,40 @@ public class JBViewport extends JViewport { } @Override - public Dimension getPreferredSize() { - return super.getPreferredSize(); //To change body of overridden methods use File | Settings | File Templates. + public void paint(Graphics g) { + if (myZoomer != null && myZoomer.isActive()) { + myZoomer.paint(g); + } + else { + super.paint(g); + + if (myEmptyText != null) { + myEmptyText.paint(this, g); + } + } + } + + @Nullable + @Override + public Magnificator getMagnificator() { + JComponent view = (JComponent)getView(); + return view != null ? (Magnificator)view.getClientProperty(Magnificator.CLIENT_PROPERTY_KEY) : null; } @Override - public void paint(Graphics g) { - super.paint(g); + public void magnificationStarted(Point at) { + myZoomer = new ZoomingDelegate((JComponent)getView(), this); + myZoomer.magnificationStarted(at); + } - if (myEmptyText != null) { - myEmptyText.paint(this, g); - } + @Override + public void magnificationFinished(double magnification) { + myZoomer.magnificationFinished(magnification); + myZoomer = null; + } + + @Override + public void magnify(double magnification) { + myZoomer.magnify(magnification); } } diff --git a/platform/platform-api/src/com/intellij/ui/components/Magnificator.java b/platform/platform-api/src/com/intellij/ui/components/Magnificator.java new file mode 100644 index 000000000000..cc60e7fbf195 --- /dev/null +++ b/platform/platform-api/src/com/intellij/ui/components/Magnificator.java @@ -0,0 +1,29 @@ +/* + * Copyright 2000-2011 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. + */ + +/* + * @author max + */ +package com.intellij.ui.components; + +import com.intellij.openapi.util.Key; + +import java.awt.*; + +public interface Magnificator { + Key CLIENT_PROPERTY_KEY = Key.create("MagnifiableComponent"); + Point magnify(double scale, Point at); +} diff --git a/images/src/org/intellij/images/editor/impl/ImageContentProvider.java b/platform/platform-api/src/com/intellij/ui/components/ZoomableViewport.java similarity index 51% rename from images/src/org/intellij/images/editor/impl/ImageContentProvider.java rename to platform/platform-api/src/com/intellij/ui/components/ZoomableViewport.java index 15ad1f54094c..4c40ba03041d 100644 --- a/images/src/org/intellij/images/editor/impl/ImageContentProvider.java +++ b/platform/platform-api/src/com/intellij/ui/components/ZoomableViewport.java @@ -13,39 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.intellij.images.editor.impl; -import com.intellij.openapi.Disposable; -import com.intellij.openapi.vfs.VirtualFile; +/* + * @author max + */ +package com.intellij.ui.components; + import org.jetbrains.annotations.Nullable; -import java.awt.image.BufferedImage; -import java.util.EventListener; - -/** - * User: ksafonov - */ -public interface ImageContentProvider extends Disposable { - - interface ImageContent { - @Nullable - BufferedImage getImage(); - - @Nullable - String getFormat(); - } - - interface ContentChangeListener extends EventListener { - void contentChanged(); - } - - ImageContent getContent(); - - void addContentChangeListener(ContentChangeListener listener); +import java.awt.*; +public interface ZoomableViewport { @Nullable - VirtualFile getVirtualFile(); - - long getFileLength(); - + Magnificator getMagnificator(); + void magnificationStarted(Point at); + void magnificationFinished(double magnification); + void magnify(double magnification); } diff --git a/platform/platform-api/src/com/intellij/ui/components/ZoomingDelegate.java b/platform/platform-api/src/com/intellij/ui/components/ZoomingDelegate.java new file mode 100644 index 000000000000..0ddd352b194c --- /dev/null +++ b/platform/platform-api/src/com/intellij/ui/components/ZoomingDelegate.java @@ -0,0 +1,125 @@ +/* + * Copyright 2000-2011 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. + */ + +/* + * @author max + */ +package com.intellij.ui.components; + +import com.intellij.ui.Gray; + +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; + +public class ZoomingDelegate { + private final JComponent myContentComponent; + private final JComponent myViewportComponent; + + private BufferedImage myCachedImage; + private Point myMagnificationPoint; + private double myMagnification; + + public ZoomingDelegate(JComponent contentComponent, JComponent viewportComponent) { + myContentComponent = contentComponent; + myViewportComponent = viewportComponent; + } + + public void paint(Graphics g) { + if (myCachedImage != null && myMagnificationPoint != null && myMagnification != 0) { + double scale = magnificationToScale(myMagnification); + int xoffset = (int)(myMagnificationPoint.x - myMagnificationPoint.x * scale); + int yoffset = (int)(myMagnificationPoint.y - myMagnificationPoint.y * scale); + + Rectangle clip = g.getClipBounds(); + + g.setColor(Gray._120); + g.fillRect(clip.x, clip.y, clip.width, clip.height); + + Graphics2D translated = (Graphics2D)g.create(); + translated.translate(xoffset, yoffset); + translated.scale(scale, scale); + + translated.drawImage(myCachedImage, 0, 0, null); + } + } + + public void magnificationStarted(Point at) { + myMagnificationPoint = at; + } + + public void magnificationFinished(double magnification) { + if (myMagnification != 0) { + Magnificator magnificator = ((ZoomableViewport)myViewportComponent).getMagnificator(); + + if (magnificator != null) { + Point inContent = convertToContentCoordinates(myMagnificationPoint); + + final Point inContentScaled = magnificator.magnify(magnificationToScale(magnification), inContent); + + int voffset = inContentScaled.y - myMagnificationPoint.y; + int hoffset = inContentScaled.x - myMagnificationPoint.x; + myViewportComponent.repaint(); + myViewportComponent.validate(); + + scrollTo(voffset, hoffset); + } + } + + myMagnificationPoint = null; + myMagnification = 0; + myCachedImage = null; + } + + protected void scrollTo(int voffset, int hoffset) { + JViewport viewport = (JViewport)myViewportComponent; + JScrollPane pane = (JScrollPane)viewport.getParent(); + JScrollBar vsb = pane.getVerticalScrollBar(); + vsb.setValue(voffset); + JScrollBar hsb = pane.getHorizontalScrollBar(); + hsb.setValue(hoffset); + } + + protected Point convertToContentCoordinates(Point point) { + return SwingUtilities.convertPoint(myViewportComponent, point, myContentComponent); + } + + public boolean isActive() { + return myCachedImage != null; + } + + private static double magnificationToScale(double magnification) { + return magnification < 0 ? 1f / (1 - magnification) : (1 + magnification); + } + + public void magnify(double magnification) { + if (myMagnification != magnification) { + myMagnification = magnification; + + if (myCachedImage == null) { + Rectangle bounds = myViewportComponent.getBounds(); + BufferedImage image = new BufferedImage(bounds.width, bounds.height, BufferedImage.TYPE_INT_RGB); + + Graphics graphics = image.getGraphics(); + graphics.setClip(0, 0, bounds.width, bounds.height); + myViewportComponent.paint(graphics); + + myCachedImage = image; + } + } + myViewportComponent.repaint(); + } +} diff --git a/platform/platform-api/src/com/intellij/ui/table/TableView.java b/platform/platform-api/src/com/intellij/ui/table/TableView.java index 9995209c32cd..f329dd3bd866 100644 --- a/platform/platform-api/src/com/intellij/ui/table/TableView.java +++ b/platform/platform-api/src/com/intellij/ui/table/TableView.java @@ -86,7 +86,7 @@ public class TableView extends BaseTableView implements ItemsProvider, Sel final TableColumn column = getColumnModel().getColumn(i); // hack to get sort arrow included into the renderer component if (sorter != null && columnInfo.isSortable()) { - sorter.setSortKeys(Collections.singletonList(new RowSorter.SortKey(0, SortOrder.ASCENDING))); + sorter.setSortKeys(Collections.singletonList(new RowSorter.SortKey(i, SortOrder.ASCENDING))); } final Component headerComponent = defaultRenderer == null? null : diff --git a/platform/platform-api/src/com/intellij/ui/treeStructure/filtered/FilteringTreeBuilder.java b/platform/platform-api/src/com/intellij/ui/treeStructure/filtered/FilteringTreeBuilder.java index a8276ef23902..1fd9c7972b3a 100644 --- a/platform/platform-api/src/com/intellij/ui/treeStructure/filtered/FilteringTreeBuilder.java +++ b/platform/platform-api/src/com/intellij/ui/treeStructure/filtered/FilteringTreeBuilder.java @@ -187,10 +187,14 @@ public class FilteringTreeBuilder extends AbstractTreeBuilder { } public void revalidateTree() { - myTree.invalidate(); - myTree.setRowHeight(myTree.getRowHeight() == -1 ? -2 : -1); - myTree.revalidate(); - myTree.repaint(); + revalidateTree(myTree); + } + + public static void revalidateTree(Tree tree) { + tree.invalidate(); + tree.setRowHeight(tree.getRowHeight() == -1 ? -2 : -1); + tree.revalidate(); + tree.repaint(); } diff --git a/platform/platform-impl/src/com/intellij/diagnostic/LogMessageEx.java b/platform/platform-impl/src/com/intellij/diagnostic/LogMessageEx.java index 9eb4a2184d79..f299f783b408 100644 --- a/platform/platform-impl/src/com/intellij/diagnostic/LogMessageEx.java +++ b/platform/platform-impl/src/com/intellij/diagnostic/LogMessageEx.java @@ -18,6 +18,7 @@ package com.intellij.diagnostic; import com.intellij.diagnostic.errordialog.Attachment; import com.intellij.openapi.diagnostic.IdeaLoggingEvent; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.util.ExceptionUtil; import com.intellij.util.SmartList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -137,7 +138,8 @@ public class LogMessageEx extends LogMessage { if (details.length > 0 && detailsBuffer.length() > 0) { detailsBuffer.setLength(detailsBuffer.length() - 1); } - logger.error(createEvent(message, detailsBuffer.toString(), null, null, (Attachment)null)); + Attachment attachment = detailsBuffer.length() > 0 ? new Attachment("current-context.txt", detailsBuffer.toString()) : null; + logger.error(createEvent(message, ExceptionUtil.getThrowableText(new Throwable()), null, null, attachment)); } /** diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/MacGestureAdapter.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/MacGestureAdapter.java index 32538508f7a0..a0404c9e99d5 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/MacGestureAdapter.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/MacGestureAdapter.java @@ -16,9 +16,16 @@ package com.intellij.openapi.actionSystem.impl; import com.apple.eawt.event.*; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.wm.IdeFrame; +import com.intellij.ui.components.Magnificator; +import com.intellij.ui.components.ZoomableViewport; import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.MouseEvent; /** * User: anna @@ -28,6 +35,7 @@ class MacGestureAdapter extends GestureAdapter { double magnification; private final IdeFrame myFrame; private MouseGestureManager myManager; + private ZoomableViewport myMagnifyingViewport; public MacGestureAdapter(MouseGestureManager manager, IdeFrame frame) { myFrame = frame; @@ -38,35 +46,63 @@ class MacGestureAdapter extends GestureAdapter { @Override public void gestureBegan(GesturePhaseEvent event) { - myManager.activateTrackpad(); magnification = 0; + + Point mouse = MouseInfo.getPointerInfo().getLocation(); + SwingUtilities.convertPointFromScreen(mouse, myFrame.getComponent()); + Component deepest = SwingUtilities.getDeepestComponentAt(myFrame.getComponent(), mouse.x, mouse.y); + ZoomableViewport viewport = (ZoomableViewport) SwingUtilities.getAncestorOfClass(ZoomableViewport.class, deepest); + if (viewport != null) { + Magnificator magnificator = viewport.getMagnificator(); + + if (magnificator != null) { + Point at = MouseInfo.getPointerInfo().getLocation(); + SwingUtilities.convertPointFromScreen(at, (JComponent)viewport); + viewport.magnificationStarted(at); + myMagnifyingViewport = viewport; + } + } } @Override public void gestureEnded(GesturePhaseEvent event) { - myManager.activateTrackpad(); - if (magnification != 0) { - MouseGestureManager.processMagnification(myFrame, magnification); + if (myMagnifyingViewport != null) { + myMagnifyingViewport.magnificationFinished(magnification); + myMagnifyingViewport = null; magnification = 0; } } @Override public void swipedLeft(SwipeEvent event) { - myManager.activateTrackpad(); - myManager.processLeftSwipe(myFrame); + ActionManager actionManager = ActionManager.getInstance(); + AnAction forward = actionManager.getAction("Forward"); + if (forward == null) return; + + actionManager.tryToExecute(forward, createMouseEventWrapper(myFrame), null, null, false); } @Override public void swipedRight(SwipeEvent event) { - myManager.activateTrackpad(); - myManager.processRightSwipe(myFrame); + ActionManager actionManager = ActionManager.getInstance(); + AnAction back = actionManager.getAction("Back"); + if (back == null) return; + + actionManager.tryToExecute(back, createMouseEventWrapper(myFrame), null, null, false); } + private static MouseEvent createMouseEventWrapper(IdeFrame frame) { + return new MouseEvent(frame.getComponent(), ActionEvent.ACTION_PERFORMED, System.currentTimeMillis(), 0, 0, 0, 0, false, 0); + } + + @Override public void magnify(MagnificationEvent event) { myManager.activateTrackpad(); magnification += event.getMagnification(); + if (myMagnifyingViewport != null) { + myMagnifyingViewport.magnify(magnification); + } } public void remove(JComponent cmp) { diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/MouseGestureManager.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/MouseGestureManager.java index 7e4ae8bb03fd..d644c7120f7e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/MouseGestureManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/MouseGestureManager.java @@ -39,14 +39,11 @@ import java.util.Map; public class MouseGestureManager implements ApplicationComponent { private static final Logger LOG = Logger.getInstance("MouseGestureManager"); - private ActionManagerImpl myActionManager; private Map myListeners = new HashMap(); private boolean HAS_TRACKPAD = false; - - public MouseGestureManager(ActionManagerImpl actionManager) { - myActionManager = actionManager; + public MouseGestureManager() { } public void add(final IdeFrame frame) { @@ -76,38 +73,6 @@ public class MouseGestureManager implements ApplicationComponent { return HAS_TRACKPAD; } - protected static void processMagnification(IdeFrame frame, double magnification) { - Point mouse = MouseInfo.getPointerInfo().getLocation(); - SwingUtilities.convertPointFromScreen(mouse, frame.getComponent()); - Component componentAt = SwingUtilities.getDeepestComponentAt(frame.getComponent(), mouse.x, mouse.y); - if (componentAt != null) { - Editor editor = PlatformDataKeys.EDITOR.getData(DataManager.getInstance().getDataContext(componentAt)); - if (editor != null) { - double currentSize = editor.getColorsScheme().getEditorFontSize(); - int defaultFontSize = EditorColorsManager.getInstance().getGlobalScheme().getEditorFontSize(); - ((EditorEx)editor).setFontSize((int)(Math.max(currentSize + magnification * 3, defaultFontSize))); - } - } - } - - protected void processLeftSwipe(IdeFrame frame) { - AnAction forward = myActionManager.getAction("Forward"); - if (forward == null) return; - - myActionManager.tryToExecute(forward, createMouseEventWrapper(frame), null, null, false); - } - - protected void processRightSwipe(IdeFrame frame) { - AnAction back = myActionManager.getAction("Back"); - if (back == null) return; - - myActionManager.tryToExecute(back, createMouseEventWrapper(frame), null, null, false); - } - - private static MouseEvent createMouseEventWrapper(IdeFrame frame) { - return new MouseEvent(frame.getComponent(), ActionEvent.ACTION_PERFORMED, System.currentTimeMillis(), 0, 0, 0, 0, false, 0); - } - public void remove(IdeFrame frame) { if (!Registry.is("actionSystem.mouseGesturesEnabled")) return; diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java index 6560ad8b1cdd..b11b88efc34b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java @@ -212,20 +212,22 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, validateCallContext(); final LogicalPosition logicalPosition = myEditor.offsetToLogicalPosition(offset); moveToLogicalPosition(logicalPosition, locateBeforeSoftWrap, null); - if (!ignoreWrongMoves && !myEditor.offsetToLogicalPosition(myOffset).equals(logicalPosition)) { + final LogicalPosition positionByOffsetAfterMove = myEditor.offsetToLogicalPosition(myOffset); + if (!ignoreWrongMoves && !positionByOffsetAfterMove.equals(logicalPosition)) { StringBuilder debugBuffer = new StringBuilder(); moveToLogicalPosition(logicalPosition, locateBeforeSoftWrap, debugBuffer); int textStart = Math.max(0, Math.min(offset, myOffset) - 1); final DocumentEx document = myEditor.getDocument(); int textEnd = Math.min(document.getTextLength() - 1, Math.max(offset, myOffset) + 1); CharSequence text = document.getCharsSequence().subSequence(textStart, textEnd); - LOG.error( - "caret moved to wrong offset. Requested: offset=" + offset + ", logical position=" + logicalPosition - + " but actual: offset=" + myOffset + ", logical position=" + myLogicalCaret + "(" + myEditor.offsetToLogicalPosition(myOffset) - + "). " + myEditor.dumpState() - + "\n interested text [" + textStart + "; " + textEnd + "): '" + text + "'" - + "\n debug trace: " + debugBuffer - ); + LogMessageEx.error( + LOG, "caret moved to wrong offset", + String.format( + "Requested: offset=%d, logical position='%s' but actual: offset=%d, logical position='%s' (%s). %s%n" + + "interested text [%d;%d): '%s'%n debug trace: %s", + offset, logicalPosition, myOffset, myLogicalCaret, positionByOffsetAfterMove, myEditor.dumpState(), + textStart, textEnd, text, debugBuffer + )); } } @@ -408,7 +410,7 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, assertIsDispatchThread(); if (debugBuffer != null) { debugBuffer.append(String.format( - "Start moveToLogicalPosition(). Locate before soft wrap: %b, position: %s", locateBeforeSoftWrap, pos + "Start moveToLogicalPosition(). Locate before soft wrap: %b, position: %s%n", locateBeforeSoftWrap, pos )); } myDesiredX = -1; @@ -423,14 +425,14 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, if (column < 0) { if (debugBuffer != null) { - debugBuffer.append("Resetting target logical column to zero as it is negative (" + column + ")"); + debugBuffer.append("Resetting target logical column to zero as it is negative (" + column + ")\n"); } column = 0; softWrapColumns = 0; } if (line < 0) { if (debugBuffer != null) { - debugBuffer.append("Resetting target logical line to zero as it is negative (" + line + ")"); + debugBuffer.append("Resetting target logical line to zero as it is negative (" + line + ")\n"); } line = 0; softWrapLinesBefore = 0; @@ -440,14 +442,14 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, int lineCount = doc.getLineCount(); if (lineCount == 0) { if (debugBuffer != null) { - debugBuffer.append("Resetting target logical line to zero as the document is empty"); + debugBuffer.append("Resetting target logical line to zero as the document is empty\n"); } line = 0; } else if (line > lineCount - 1) { if (debugBuffer != null) { debugBuffer.append(String.format( - "Resetting target logical line (%d) to %d as it is greater than total document lines number", line, lineCount - 1 + "Resetting target logical line (%d) to %d as it is greater than total document lines number%n", line, lineCount - 1 )); } line = lineCount - 1; @@ -470,7 +472,7 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, if (debugBuffer != null) { debugBuffer.append(String.format( "Resetting target logical column (%d) to %d because caret is not allowed to be located after line end (offset: %d, " - + "logical position: %s). Current soft wrap columns value: %d", + + "logical position: %s). Current soft wrap columns value: %d%n", oldColumn, lineEndColumnNumber, lineEndOffset, endLinePosition, softWrapColumns )); } @@ -494,14 +496,14 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, setCurrentLogicalCaret(logicalPositionToUse); final int offset = myEditor.logicalPositionToOffset(myLogicalCaret); if (debugBuffer != null) { - debugBuffer.append(String.format("Resulting logical position to use: %s. It's mapped to offset %d", myLogicalCaret, offset)); + debugBuffer.append(String.format("Resulting logical position to use: %s. It's mapped to offset %d%n", myLogicalCaret, offset)); } FoldRegion collapsedAt = myEditor.getFoldingModel().getCollapsedRegionAtOffset(offset); if (collapsedAt != null && offset > collapsedAt.getStartOffset()) { if (debugBuffer != null) { - debugBuffer.append("Scheduling expansion of fold region ").append(collapsedAt); + debugBuffer.append("Scheduling expansion of fold region ").append(collapsedAt).append("\n"); } Runnable runnable = new Runnable() { @Override @@ -513,7 +515,7 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, } }; - myEditor.getFoldingModel().runBatchFoldingOperation(runnable); + myEditor.getFoldingModel().runBatchFoldingOperation(runnable, false); } myEditor.setLastColumnNumber(myLogicalCaret.column); @@ -521,7 +523,7 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, myOffset = myEditor.logicalPositionToOffset(myLogicalCaret); if (debugBuffer != null) { - debugBuffer.append(String.format("Storing offset %d (mapped from logical position %s)", myOffset, myLogicalCaret)); + debugBuffer.append(String.format("Storing offset %d (mapped from logical position %s)%n", myOffset, myLogicalCaret)); } LOG.assertTrue(myOffset >= 0 && myOffset <= myEditor.getDocument().getTextLength()); @@ -537,7 +539,7 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, final VisualPosition visualPosition = new VisualPosition(lineToUse, EditorUtil.getLastVisualLineColumnNumber(myEditor, lineToUse)); if (debugBuffer != null) { debugBuffer.append(String.format( - "Adjusting caret position by moving it before soft wrap. Moving to visual position %s", visualPosition + "Adjusting caret position by moving it before soft wrap. Moving to visual position %s%n", visualPosition )); } moveToVisualPosition(visualPosition); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorComponentImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorComponentImpl.java index deaef127e15c..50a87000b721 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorComponentImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorComponentImpl.java @@ -19,21 +19,21 @@ import com.intellij.ide.IdeEventQueue; import com.intellij.ide.ui.UISettings; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.editor.VisualPosition; +import com.intellij.ui.components.Magnificator; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.impl.ApplicationImpl; +import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.ex.util.EditorUtil; import com.intellij.openapi.ui.Queryable; import com.intellij.openapi.ui.TypingTarget; import com.intellij.openapi.util.ActionCallback; -import com.intellij.util.ReflectionUtil; import com.intellij.util.ui.UIUtil; import javax.swing.*; import java.awt.*; import java.awt.event.ComponentEvent; -import java.awt.event.FocusEvent; import java.awt.event.InputMethodEvent; -import java.awt.im.InputContext; import java.awt.im.InputMethodRequests; import java.util.Map; @@ -46,6 +46,19 @@ public class EditorComponentImpl extends JComponent implements Scrollable, DataP enableInputMethods(true); setFocusCycleRoot(true); setOpaque(true); + + putClientProperty(Magnificator.CLIENT_PROPERTY_KEY, new Magnificator() { + @Override + public Point magnify(double scale, Point at) { + VisualPosition magnificationPosition = myEditor.xyToVisualPosition(at); + + double currentSize = myEditor.getColorsScheme().getEditorFontSize(); + int defaultFontSize = EditorColorsManager.getInstance().getGlobalScheme().getEditorFontSize(); + myEditor.setFontSize((int)(double)(int)(Math.max(currentSize * scale, defaultFontSize))); + + return myEditor.visualPositionToXY(magnificationPosition); + } + }); } public EditorImpl getEditor() { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 2f83e2241f10..6ae7e4c2ec0a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -885,7 +885,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi public void setHighlighter(@NotNull EditorHighlighter highlighter) { assertIsDispatchThread(); final Document document = getDocument(); - if (myHighlighter != null) { + if (myHighlighter != null && !isDisposed()) { document.removeDocumentListener(myHighlighter); } @@ -990,14 +990,14 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi CharSequence text = myDocument.getCharsNoThreadCheck(); - LogicalPosition endLogicalPosition = visualToLogicalPosition(new VisualPosition(line+1, 0)); + LogicalPosition endLogicalPosition = visualToLogicalPosition(new VisualPosition(line + 1, 0)); int endOffset = logicalPositionToOffset(endLogicalPosition); if (offset > endOffset) { - LOG.error(String.format( - "Detected invalid (x;y)->VisualPosition processing. Given point: %s, mapped to visual line %d. Visual(%d; %d) is mapped to " - + "logical position '%s' which is mapped to offset %d (start offset). Visual(%d; %d) is mapped to logical '%s' which is mapped " - + "to offset %d (end offset). State: %s", + LogMessageEx.error(LOG, "Detected invalid (x; y)->VisualPosition processing", String.format( + "Given point: %s, mapped to visual line %d. Visual(%d; %d) is mapped to " + + "logical position '%s' which is mapped to offset %d (start offset). Visual(%d; %d) is mapped to logical '%s' which is mapped " + + "to offset %d (end offset). State: %s", p, line, line, 0, logicalPosition, offset, line + 1, 0, endLogicalPosition, endOffset, dumpState() )); return new VisualPosition(line, EditorUtil.columnsNumber(p.x, EditorUtil.getSpaceWidth(Font.PLAIN, this))); @@ -3292,7 +3292,8 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi int foldedLinesCountBefore = myFoldingModel.getFoldedLinesCountBefore(offset); line -= foldedLinesCountBefore; if (line < 0) { - LOG.error(String.format( + LogMessageEx.error( + LOG, "Invalid LogicalPosition -> VisualPosition processing", String.format( "Given logical position: %s; matched line: %d; fold lines before: %d, state: %s", logicalPos, line, foldedLinesCountBefore, dumpState() )); @@ -3300,7 +3301,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi FoldRegion[] topLevel = myFoldingModel.fetchTopLevel(); LogicalPosition anchorFoldingPosition = logicalPos; - for (int idx = myFoldingModel.getLastTopLevelIndexBefore(offset); idx >= 0; idx--) { + for (int idx = myFoldingModel.getLastTopLevelIndexBefore(offset); idx >= 0 && topLevel != null; idx--) { FoldRegion region = topLevel[idx]; if (region.isValid()) { if (region.getDocument().getLineNumber(region.getEndOffset()) == anchorFoldingPosition.line && region.getEndOffset() <= offset) { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldRegionImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldRegionImpl.java index 51c5f497491c..d18ae9481f33 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldRegionImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldRegionImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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. @@ -110,7 +110,7 @@ public class FoldRegionImpl extends RangeMarkerImpl implements FoldRegion { } public String toString() { - return "FoldRegion " + (isExpanded() ? "-" : "+") + - "(" + getStartOffset() + ":" + getEndOffset() + ")" + (isValid() ? "" : "(invalid)"); + return "FoldRegion " + (isExpanded() ? "-" : "+") + "(" + getStartOffset() + ":" + getEndOffset() + ")" + + (isValid() ? "" : "(invalid)") + ", placeholder='" + getPlaceholderText() + "'"; } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java index 6fd0a67a4e0c..1adca403dcd4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 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. @@ -188,10 +188,15 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedDocumentList @Override public void runBatchFoldingOperation(@NotNull Runnable operation) { - runBatchFoldingOperation(operation, false); + runBatchFoldingOperation(operation, false, true); } - private void runBatchFoldingOperation(final Runnable operation, final boolean dontCollapseCaret) { + @Override + public void runBatchFoldingOperation(@NotNull Runnable operation, boolean moveCaret) { + runBatchFoldingOperation(operation, false, moveCaret); + } + + private void runBatchFoldingOperation(final Runnable operation, final boolean dontCollapseCaret, final boolean moveCaret) { assertIsDispatchThread(); boolean oldDontCollapseCaret = myDoNotCollapseCaret; myDoNotCollapseCaret |= dontCollapseCaret; @@ -207,7 +212,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedDocumentList if (!oldBatchFlag) { if (myFoldRegionsProcessed) { - notifyBatchFoldingProcessingDone(); + notifyBatchFoldingProcessingDone(moveCaret); myFoldRegionsProcessed = false; } myIsBatchFoldingProcessing = false; @@ -217,7 +222,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedDocumentList @Override public void runBatchFoldingOperationDoNotCollapseCaret(@NotNull final Runnable operation) { - runBatchFoldingOperation(operation, true); + runBatchFoldingOperation(operation, true, true); } public void flushCaretShift() { @@ -337,11 +342,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedDocumentList notifyListenersOnFoldRegionStateChange(region); } - private void notifyBatchFoldingProcessingDone() { - doNotifyBatchFoldingProcessingDone(); - } - - private void doNotifyBatchFoldingProcessingDone() { + private void notifyBatchFoldingProcessingDone(final boolean moveCaretFromCollapsedRegion) { myFoldTree.rebuild(); for (FoldingListener listener : myListeners) { @@ -390,14 +391,16 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedDocumentList boolean oldCaretPositionSaved = myCaretPositionSaved; - if (offsetToUse >= 0) { - myEditor.getCaretModel().moveToOffset(offsetToUse); - } - else if (column != -1) { - myEditor.getCaretModel().moveToLogicalPosition(new LogicalPosition(line, column)); - } - else { - myEditor.getCaretModel().moveToLogicalPosition(caretPosition); + if (moveCaretFromCollapsedRegion) { + if (offsetToUse >= 0) { + myEditor.getCaretModel().moveToOffset(offsetToUse); + } + else if (column != -1) { + myEditor.getCaretModel().moveToLogicalPosition(new LogicalPosition(line, column)); + } + else { + myEditor.getCaretModel().moveToLogicalPosition(caretPosition); + } } myCaretPositionSaved = oldCaretPositionSaved; diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapModelImpl.java index 84a4de25a325..7f228571ca81 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/SoftWrapModelImpl.java @@ -619,6 +619,11 @@ public class SoftWrapModelImpl implements SoftWrapModelEx, PrioritizedDocumentLi myDirty = true; } } + + @NotNull + public CachingSoftWrapDataMapper getDataMapper() { + return myDataMapper; + } @Override public void release() { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/AbstractMappingStrategy.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/AbstractMappingStrategy.java index cb7fd4cf07d6..20417fa7a756 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/AbstractMappingStrategy.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/AbstractMappingStrategy.java @@ -42,8 +42,6 @@ import java.util.List; abstract class AbstractMappingStrategy implements MappingStrategy { private static final Logger LOG = Logger.getInstance("#" + AbstractMappingStrategy.class.getName()); - - protected static final CacheEntry SEARCH_KEY = new CacheEntry(0, null, null, null); protected final Editor myEditor; protected final EditorTextRepresentationHelper myRepresentationHelper; diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CacheEntry.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CacheEntry.java index 54890f9870aa..80f20e15a270 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CacheEntry.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CacheEntry.java @@ -61,7 +61,6 @@ class CacheEntry implements Comparable, Cloneable { public boolean locked; - private final List myCache; private final Editor myEditor; private final EditorTextRepresentationHelper myRepresentationHelper; @@ -71,11 +70,10 @@ class CacheEntry implements Comparable, Cloneable { /** Holds information about single line fold regions representation data. */ private TIntObjectHashMap myFoldingData = DUMMY; - CacheEntry(int visualLine, Editor editor, EditorTextRepresentationHelper representationHelper, List cache) { + CacheEntry(int visualLine, @NotNull Editor editor, @NotNull EditorTextRepresentationHelper representationHelper) { this.visualLine = visualLine; myEditor = editor; myRepresentationHelper = representationHelper; - myCache = cache; } public void setLineStartPosition(@NotNull EditorPosition context) { @@ -228,13 +226,17 @@ class CacheEntry implements Comparable, Cloneable { @Override public String toString() { - return System.identityHashCode(this) + "=visual line: " + visualLine + ", offsets: " + startOffset + "-" + endOffset - + ", fold regions: " + Arrays.toString(myFoldingData.getValues()) + ", tab data: " + myTabPositions; + return String.format( + "%d - visual line: %d, offsets: %d-%d, logical lines: %d-%d, logical columns: %d-%d, end visual column: %d, " + + "fold regions: %s, tab data: %s", + System.identityHashCode(this), visualLine, startOffset, endOffset, startLogicalLine, endLogicalLine, startLogicalColumn, + endLogicalColumn, endVisualColumn, Arrays.toString(myFoldingData.getValues()), myTabPositions + ); } @Override protected CacheEntry clone() { - final CacheEntry result = new CacheEntry(visualLine, myEditor, myRepresentationHelper, myCache); + final CacheEntry result = new CacheEntry(visualLine, myEditor, myRepresentationHelper); result.startLogicalLine = startLogicalLine; result.startLogicalColumn = startLogicalColumn; diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CachingSoftWrapDataMapper.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CachingSoftWrapDataMapper.java index 5fd1d61f2769..dba1b9312b1e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CachingSoftWrapDataMapper.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CachingSoftWrapDataMapper.java @@ -15,16 +15,15 @@ */ package com.intellij.openapi.editor.impl.softwrap.mapping; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.ex.FoldingModelEx; -import com.intellij.openapi.editor.impl.EditorImpl; import com.intellij.openapi.editor.impl.EditorTextRepresentationHelper; import com.intellij.openapi.editor.impl.softwrap.SoftWrapDataMapper; import com.intellij.openapi.editor.impl.softwrap.SoftWrapImpl; import com.intellij.openapi.editor.impl.softwrap.SoftWrapsStorage; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.Trinity; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -56,12 +55,10 @@ import java.util.List; */ public class CachingSoftWrapDataMapper implements SoftWrapDataMapper, SoftWrapAwareDocumentParsingListener { - private static final Logger LOG = Logger.getInstance("#" + CachingSoftWrapDataMapper.class.getName()); private static final boolean DEBUG_SOFT_WRAP_PROCESSING = false; /** Caches information for the document visual line starts sorted in ascending order. */ private final List myCache = new ArrayList(); - private final CacheEntry mySearchKey = new CacheEntry(0, null, null, null); private final List myAffectedByUpdateCacheEntries = new ArrayList(); private final List myNotAffectedByUpdateTailCacheEntries = new ArrayList(); private final CacheState myBeforeChangeState = new CacheState(); @@ -72,6 +69,7 @@ public class CachingSoftWrapDataMapper implements SoftWrapDataMapper, SoftWrapAw private final EditorEx myEditor; private final SoftWrapsStorage myStorage; private final EditorTextRepresentationHelper myRepresentationHelper; + private final CacheEntry mySearchKey; public CachingSoftWrapDataMapper(@NotNull EditorEx editor, @NotNull SoftWrapsStorage storage, @NotNull EditorTextRepresentationHelper representationHelper) @@ -79,6 +77,7 @@ public class CachingSoftWrapDataMapper implements SoftWrapDataMapper, SoftWrapAw myEditor = editor; myStorage = storage; myRepresentationHelper = representationHelper; + mySearchKey = new CacheEntry(0, editor, representationHelper); myOffsetToLogicalStrategy = new OffsetToLogicalCalculationStrategy(editor, storage, myCache, representationHelper); myVisualToLogicalStrategy = new VisualToLogicalCalculationStrategy(editor, storage, myCache, representationHelper); @@ -316,7 +315,7 @@ public class CachingSoftWrapDataMapper implements SoftWrapDataMapper, SoftWrapAw return lastEntry; } else if (lastEntry.visualLine < visualLine && createIfNecessary) { - CacheEntry result = new CacheEntry(visualLine, myEditor, myRepresentationHelper, myCache); + CacheEntry result = new CacheEntry(visualLine, myEditor, myRepresentationHelper); myCache.add(result); return result; } @@ -347,7 +346,7 @@ public class CachingSoftWrapDataMapper implements SoftWrapDataMapper, SoftWrapAw if (cacheEntryIndex < 0) { cacheEntryIndex = start; if (createIfNecessary) { - myCache.add(cacheEntryIndex, result = new CacheEntry(visualLine, myEditor, myRepresentationHelper, myCache)); + myCache.add(cacheEntryIndex, result = new CacheEntry(visualLine, myEditor, myRepresentationHelper)); } } else { @@ -447,30 +446,6 @@ public class CachingSoftWrapDataMapper implements SoftWrapDataMapper, SoftWrapAw } applyStateChange(exactOffsetsDiff); - // TODO den remove before v.11 release - if (myCache.size() > 1) { - CacheEntry beforeLast = myCache.get(myCache.size() - 2); - CacheEntry last = myCache.get(myCache.size() - 1); - if (beforeLast.visualLine == last.visualLine - || (beforeLast.visualLine + 1 == last.visualLine && last.startOffset - beforeLast.endOffset > 1) - || last.startOffset > myEditor.getDocument().getTextLength()) - { - CharSequence editorState = ""; - if (myEditor instanceof EditorImpl) { - editorState = ((EditorImpl)myEditor).dumpState(); - } - LOG.error( - "Detected invalid soft wraps cache update", - String.format( - "Event: %s, normal: %b.%n%nTail cache entries: %s%n%nAffected by change cache entries: %s%n%nBefore change state: %s%n%n" - + "After change state: %s%n%nEditor state: %s", - event, normal, myNotAffectedByUpdateTailCacheEntries, myAffectedByUpdateCacheEntries, - myBeforeChangeState, myAfterChangeState, editorState - ) - ); - } - } - myAffectedByUpdateCacheEntries.clear(); myNotAffectedByUpdateTailCacheEntries.clear(); @@ -620,6 +595,40 @@ public class CachingSoftWrapDataMapper implements SoftWrapDataMapper, SoftWrapAw return myCache.toString(); } + /** + * Allows to register new entry with the given data at the soft wraps cache. + *

+ * One entry is expected to contain information about single visual lines (what logical lines are mapped to it, what fold + * regions and tabulations are located there etc). + * + * @param visualLine target entry's visual line + * @param startOffset target entry's start offset + * @param endOffset target entry's end offset + * @param foldRegions target entry's fold regions + * @param tabData target entry's tab data + */ + public void rawAdd(int visualLine, + int startOffset, + int endOffset, + @NotNull List> foldRegions, + @NotNull List> tabData) + { + final CacheEntry entry = new CacheEntry(visualLine, myEditor, myRepresentationHelper); + entry.startOffset = startOffset; + entry.endOffset = endOffset; + entry.startLogicalLine = myEditor.getDocument().getLineNumber(startOffset); + entry.endLogicalLine = myEditor.getDocument().getLineNumber(endOffset); + for (Trinity region : foldRegions) { + final FoldingData foldData = new FoldingData(region.third, region.second, myRepresentationHelper, myEditor); + foldData.widthInColumns = region.first; + entry.store(foldData, region.third.getStartOffset()); + } + for (Pair pair : tabData) { + entry.storeTabData(new TabData(pair.second, pair.first)); + } + myCache.add(entry); + } + @SuppressWarnings({"UnusedDeclaration"}) public static void log(Object o) { //try { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/VisualToLogicalCalculationStrategy.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/VisualToLogicalCalculationStrategy.java index 0956043dacd0..d79e3bff8f63 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/VisualToLogicalCalculationStrategy.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/VisualToLogicalCalculationStrategy.java @@ -30,20 +30,22 @@ import java.util.List; */ class VisualToLogicalCalculationStrategy extends AbstractMappingStrategy { + private final CacheEntry mySearchKey; private VisualPosition myTargetVisual; VisualToLogicalCalculationStrategy(@NotNull Editor editor, @NotNull SoftWrapsStorage storage, @NotNull List cache, @NotNull EditorTextRepresentationHelper representationHelper) { super(editor, storage, cache, representationHelper); + mySearchKey = new CacheEntry(0, editor, representationHelper); } public void init(@NotNull final VisualPosition targetVisual, @NotNull final List cache) { reset(); myTargetVisual = targetVisual; - SEARCH_KEY.visualLine = targetVisual.line; - int i = Collections.binarySearch(cache, SEARCH_KEY); + mySearchKey.visualLine = targetVisual.line; + int i = Collections.binarySearch(cache, mySearchKey); if (i >= 0) { CacheEntry cacheEntry = cache.get(i); if (cacheEntry.visualLine == targetVisual.line) { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentFoldingModel.java b/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentFoldingModel.java index 8e7c135747ae..e8a0fd840b8e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentFoldingModel.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/textarea/TextComponentFoldingModel.java @@ -1,3 +1,18 @@ +/* + * Copyright 2000-2011 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.editor.textarea; import com.intellij.openapi.editor.FoldRegion; @@ -34,7 +49,7 @@ public class TextComponentFoldingModel implements FoldingModel { public boolean isOffsetCollapsed(int offset) { return false; } - + @Override public FoldRegion getCollapsedRegionAtOffset(int offset) { return null; @@ -44,6 +59,10 @@ public class TextComponentFoldingModel implements FoldingModel { public void runBatchFoldingOperation(@NotNull Runnable operation) { } + @Override + public void runBatchFoldingOperation(@NotNull Runnable operation, boolean moveCaretFromCollapsedRegion) { + } + @Override public void runBatchFoldingOperationDoNotCollapseCaret(@NotNull Runnable operation) { } diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java index ee891a1f25d3..8d3c6c24b150 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java @@ -527,7 +527,7 @@ public class ProjectImpl extends ComponentManagerImpl implements ProjectEx { myFileNames = ContainerUtil.map(readOnlyFiles, new Function() { @Override public String fun(VirtualFile file) { - return file.getPath(); + return file.getPresentableUrl(); } }, new String[readOnlyFiles.length]); } diff --git a/platform/platform-impl/testSrc/com/intellij/openapi/editor/impl/AbstractEditorProcessingOnDocumentModificationTest.java b/platform/platform-impl/testSrc/com/intellij/openapi/editor/impl/AbstractEditorProcessingOnDocumentModificationTest.java index 5e12429ab47d..d9a2fc1ccfb2 100644 --- a/platform/platform-impl/testSrc/com/intellij/openapi/editor/impl/AbstractEditorProcessingOnDocumentModificationTest.java +++ b/platform/platform-impl/testSrc/com/intellij/openapi/editor/impl/AbstractEditorProcessingOnDocumentModificationTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2011 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. @@ -15,12 +15,25 @@ */ package com.intellij.openapi.editor.impl; +import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.FoldRegion; +import com.intellij.openapi.editor.FoldingModel; +import com.intellij.openapi.editor.ex.FoldingModelEx; +import com.intellij.openapi.editor.impl.softwrap.mapping.CachingSoftWrapDataMapper; +import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.Trinity; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.testFramework.LightPlatformCodeInsightTestCase; import com.intellij.testFramework.TestFileType; +import org.jetbrains.annotations.NotNull; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.regex.MatchResult; +import java.util.regex.Pattern; /** * Base super class for tests that check various IJ editor functionality on managed document modification. @@ -79,4 +92,117 @@ public abstract class AbstractEditorProcessingOnDocumentModificationTest extends startOffset, Arrays.toString(foldRegions), myEditor.getDocument().getCharsSequence() )); } + + /** + * Setups document of the {@link #getEditor() current editor} according to the given text that is expected to contain + * information about document lines obtained from the {@link DocumentImpl#dumpState()}. + * + * @param data string representation of the target document's lines + */ + @SuppressWarnings("UnusedDeclaration") + protected static void setupDocument(@NotNull String data) { + Scanner scanner = new Scanner(data); + Pattern pattern = Pattern.compile("(\\d+)\\s*:\\s*(\\d+)\\s*-\\s*(\\d+)"); + StringBuilder buffer = new StringBuilder(); + while (scanner.findInLine(pattern) != null) { + final MatchResult match = scanner.match(); + int startOffset = Integer.parseInt(match.group(2)); + int endOffset = Integer.parseInt(match.group(3)); + buffer.append(StringUtil.repeatSymbol('a', endOffset - startOffset)).append('\n'); + } + if (buffer.length() > 0) { + buffer.setLength(buffer.length() - 1); + } + myEditor.getDocument().setText(buffer.toString()); + } + + /** + * Setups {@link Editor#getFoldingModel() folding model} of the {@link #getEditor() current editor} according to the given text + * that is expected to contain information obtained from the {@link FoldingModelImpl#toString()}. + * + * @param data string representation of the target fold regions + */ + protected static void setupFolding(@NotNull String data) { + Scanner scanner = new Scanner(data); + Pattern pattern = Pattern.compile("FoldRegion ([+-])\\((\\d+):(\\d+)"); + final List> infos = new ArrayList>(); + while (scanner.findInLine(pattern) != null) { + final MatchResult match = scanner.match(); + boolean expanded = "-".equals(match.group(1)); + int startOffset = Integer.parseInt(match.group(2)); + int endOffset = Integer.parseInt(match.group(3)); + infos.add(new Trinity(expanded, startOffset, endOffset)); + } + final FoldingModel foldingModel = myEditor.getFoldingModel(); + foldingModel.runBatchFoldingOperation(new Runnable() { + @Override + public void run() { + for (Trinity info : infos) { + final FoldRegion region = foldingModel.addFoldRegion(info.second, info.third, "..."); + assert region != null; + region.setExpanded(info.first); + } + } + }); + } + + /** + * Setups {@link Editor#getSoftWrapModel() soft wraps model} of the {@link #getEditor() current editor} according to the given text + * that is expected to contain information obtained from the {@link CachingSoftWrapDataMapper#toString()}. + * + * @param data string representation of the target soft wraps cache + */ + @SuppressWarnings("UnusedDeclaration") + protected static void setupSoftWraps(@NotNull String data) { + Scanner scanner = new Scanner(data); + Pattern generalPattern = + Pattern.compile("visual line: (\\d+), offsets: (\\d+)-(\\d+), fold regions: \\[([^\\]]*)\\], tab data: \\[([^\\]]*)\\]"); + Pattern foldPattern = Pattern.compile("width in columns: (-?\\d+), start X: (-?\\d+), fold region: FoldRegion [-+]\\((\\d+):(\\d+)"); + Pattern tabPattern = Pattern.compile("\\[(\\d+), width: (\\d+)"); + final SoftWrapModelImpl softWrapModel = (SoftWrapModelImpl)myEditor.getSoftWrapModel(); + final CachingSoftWrapDataMapper mapper = softWrapModel.getDataMapper(); + mapper.release(); + final FoldingModelEx foldingModel = (FoldingModelEx)myEditor.getFoldingModel(); + while (scanner.findInLine(generalPattern) != null) { + final MatchResult generalMatch = scanner.match(); + int visualLine = Integer.parseInt(generalMatch.group(1)); + int startOffset = Integer.parseInt(generalMatch.group(2)); + int endOffset = Integer.parseInt(generalMatch.group(3)); + + List> foldRegions = new ArrayList>(); + Scanner foldScanner = new Scanner(generalMatch.group(4)); + while (foldScanner.findInLine(foldPattern) != null) { + final MatchResult foldMatch = foldScanner.match(); + int widthInColumns = Integer.parseInt(foldMatch.group(1)); + int startX = Integer.parseInt(foldMatch.group(2)); + int foldStartOffset = Integer.parseInt(foldMatch.group(3)); + int foldEndOffset = Integer.parseInt(foldMatch.group(4)); + FoldRegion region = null; + for (FoldRegion candidate : foldingModel.getAllFoldRegions()) { + if (candidate.getStartOffset() == foldStartOffset && candidate.getEndOffset() == foldEndOffset) { + region = candidate; + break; + } + } + foldRegions.add(new Trinity(widthInColumns, startX, region)); + } + + List> tabData = new ArrayList>(); + Scanner tabScanner = new Scanner(generalMatch.group(5)); + while (tabScanner.findInLine(tabPattern) != null) { + final MatchResult tabMatch = tabScanner.match(); + int offset = Integer.parseInt(tabMatch.group(1)); + int widthInColumns = Integer.parseInt(tabMatch.group(2)); + tabData.add(new Pair(offset, widthInColumns)); + } + + mapper.rawAdd(visualLine, startOffset, endOffset, foldRegions, tabData); + } + } + + public static void main(String[] args) { + setupFolding( + "FoldRegion +(0:600), FoldRegion +(640:1573), FoldRegion +(8130:8233), FoldRegion +(10189:10257), FoldRegion +(13582:13686), FoldRegion +(22805:22829), FoldRegion +(24069:24147), FoldRegion +(25024:25214), FoldRegion +(28313:28362), FoldRegion -(-1:-1)(invalid), FoldRegion -(-1:-1)(invalid), FoldRegion -(-1:-1)(invalid), FoldRegion -(-1:-1)(invalid)" + ); + } } diff --git a/platform/platform-resources-en/src/messages/IdeBundle.properties b/platform/platform-resources-en/src/messages/IdeBundle.properties index 493a92ec52aa..b566ce38f0bb 100644 --- a/platform/platform-resources-en/src/messages/IdeBundle.properties +++ b/platform/platform-resources-en/src/messages/IdeBundle.properties @@ -499,11 +499,11 @@ error.list.of.plugins.was.not.loaded=List of plugins was not loaded: {0} action.download.and.install.plugin=Download and Install action.update.plugin=Update Plugin error.plugin.download.failed=Plugin download failed -prompt.download.and.install.plugin=Would you like to download and install plugin \"{0}\"? -prompt.update.plugin=Would you like to update plugin \"{0}\"? +prompt.download.and.install.plugin=Would you like to download and install plugin ''{0}''? +prompt.update.plugin=Would you like to update plugin ''{0}''? prompt.install.several.plugins=Install or update {0} plugins ? action.uninstall.plugin=Uninstall -prompt.uninstall.plugin=Do you really want to uninstall plugin \"{0}\"? +prompt.uninstall.plugin=Do you really want to uninstall plugin ''{0}''? prompt.uninstall.several.plugins=Do you really want to uninstall these {0} plugins ? title.plugin.uninstall=Plugin Uninstall progress.downloading.list.of.plugins=Downloading List of Plugins @@ -989,7 +989,6 @@ project.import.default.name=ImportedFrom{0} project.import.default.name.dotIdea=Imported From {0} project.import.select.title=Select {0} projects to import project.import.show.settings.after=&Open Project Structure after import -project.import.open.existing=There is {0} in ''{1}''.\nDo you want to proceed with reimporting ''{2}'' or open the existing project? project.import.open.existing=There is {0} in ''{1}''.\nDo you want to open the existing project or delete it and import ''{2}''? project.import.open.existing.openExisting=Open Existing Project project.import.open.existing.reimport=Delete Existing Project and Import diff --git a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/OutputLineSplitterTest.java b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/OutputLineSplitterTest.java index d1d5d385ef47..5e6bf8247d03 100644 --- a/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/OutputLineSplitterTest.java +++ b/platform/smRunner/testSrc/com/intellij/execution/testframework/sm/OutputLineSplitterTest.java @@ -145,7 +145,7 @@ public class OutputLineSplitterTest extends UsefulTestCase { if (i % 10 == 0) { written.release(); try { - if (!read.tryAcquire(1, TimeUnit.SECONDS)) throw new TimeoutException(); + if (!read.tryAcquire(10, TimeUnit.SECONDS)) throw new TimeoutException(); } catch (Exception e) { throw new RuntimeException(e); @@ -179,10 +179,15 @@ public class OutputLineSplitterTest extends UsefulTestCase { assertTrue(hadOutput); } finally { - isFinished.set(true); + try { + isFinished.set(true); - for (Future each : futures) { - each.get(1, TimeUnit.SECONDS); + for (Future each : futures) { + each.get(10, TimeUnit.SECONDS); + } + } + catch (Exception e) { + e.printStackTrace(); } } } diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/ProjectLevelVcsManager.java b/platform/vcs-api/src/com/intellij/openapi/vcs/ProjectLevelVcsManager.java index b2c7e4b3c262..0803d1f0db21 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/ProjectLevelVcsManager.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/ProjectLevelVcsManager.java @@ -84,6 +84,7 @@ public abstract class ProjectLevelVcsManager { * @param name the name of the VCS to find. * @return the VCS instance, or null if none is found. */ + @Nullable public abstract AbstractVcs findVcsByName(@NonNls String name); @Nullable diff --git a/platform/vcs-impl/src/com/intellij/ide/actions/StartUseVcsAction.java b/platform/vcs-impl/src/com/intellij/ide/actions/StartUseVcsAction.java index 80fb5a727de4..5d4a4b549025 100644 --- a/platform/vcs-impl/src/com/intellij/ide/actions/StartUseVcsAction.java +++ b/platform/vcs-impl/src/com/intellij/ide/actions/StartUseVcsAction.java @@ -20,6 +20,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.vcs.AbstractVcs; import com.intellij.openapi.vcs.ProjectLevelVcsManager; import com.intellij.openapi.vcs.VcsBundle; import com.intellij.openapi.vcs.VcsDirectoryMapping; @@ -27,6 +28,7 @@ import com.intellij.openapi.vcs.VcsDirectoryMapping; import java.util.Arrays; public class StartUseVcsAction extends AnAction implements DumbAware { + @Override public void update(final AnActionEvent e) { final VcsDataWrapper data = new VcsDataWrapper(e); @@ -40,6 +42,7 @@ public class StartUseVcsAction extends AnAction implements DumbAware { } } + @Override public void actionPerformed(final AnActionEvent e) { final VcsDataWrapper data = new VcsDataWrapper(e); final boolean enabled = data.enabled(); @@ -53,7 +56,9 @@ public class StartUseVcsAction extends AnAction implements DumbAware { final String vcsName = dialog.getVcs(); if (vcsName.length() > 0) { final ProjectLevelVcsManager manager = data.getManager(); - manager.findVcsByName(vcsName).generalPreConfigurationStep(); + AbstractVcs vcs = manager.findVcsByName(vcsName); + assert vcs != null : "No vcs found for name " + vcsName; + vcs.generalPreConfigurationStep(); manager.setDirectoryMappings(Arrays.asList(new VcsDirectoryMapping("", vcsName))); } } diff --git a/platform/vcs-impl/src/com/intellij/ide/actions/StartUseVcsDialog.java b/platform/vcs-impl/src/com/intellij/ide/actions/StartUseVcsDialog.java index 7b67aef3f0f5..dbe18c7bfc4b 100644 --- a/platform/vcs-impl/src/com/intellij/ide/actions/StartUseVcsDialog.java +++ b/platform/vcs-impl/src/com/intellij/ide/actions/StartUseVcsDialog.java @@ -15,7 +15,6 @@ */ package com.intellij.ide.actions; -import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.MultiLineLabelUI; import com.intellij.openapi.vcs.VcsBundle; @@ -29,13 +28,14 @@ import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.List; -public class StartUseVcsDialog extends DialogWrapper { +class StartUseVcsDialog extends DialogWrapper { private final VcsDataWrapper myData; private VcsCombo myVcsCombo; private String mySelected; - public StartUseVcsDialog(final VcsDataWrapper data) { + StartUseVcsDialog(final VcsDataWrapper data) { super(data.getProject(), true); myData = data; setTitle(VcsBundle.message("dialog.enable.version.control.integration.title")); @@ -93,13 +93,8 @@ public class StartUseVcsDialog extends DialogWrapper { } @Override - protected Action[] createActions() { - return new Action[]{getOKAction(), getCancelAction(), getHelpAction()}; - } - - @Override - protected void doHelpAction() { - HelpManager.getInstance().invokeHelp("reference.version.control.enable.version.control.integration"); + protected String getHelpId() { + return "reference.version.control.enable.version.control.integration"; } @Override @@ -110,15 +105,19 @@ public class StartUseVcsDialog extends DialogWrapper { private Object[] prepareComboData() { final Collection displayNames = myData.getVcses().keySet(); - final java.util.List keys = new ArrayList(displayNames.size() + 1); + final List keys = new ArrayList(displayNames.size() + 1); keys.add(""); keys.addAll(displayNames); Collections.sort(keys); return ArrayUtil.toObjectArray(keys); } + String getVcs() { + return myData.getVcses().get(mySelected); + } + private static class VcsCombo extends JComboBox { - private VcsCombo(final Object items[]) { + private VcsCombo(final Object[] items) { super(items); setSelectedIndex(0); setEditable(false); @@ -130,7 +129,4 @@ public class StartUseVcsDialog extends DialogWrapper { } } - public String getVcs() { - return myData.getVcses().get(mySelected); - } } diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java index df79670a58d1..bb30b7b3ea2c 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidRenderscriptCompiler.java @@ -140,7 +140,7 @@ public class AndroidRenderscriptCompiler implements SourceGeneratingCompiler { for (GenerationItem item : generationItems) { final MyGenerationItem genItem = (MyGenerationItem)item; final File genDir = new File(genItem.myGenRootPath); - CompilerUtil.refreshIOFile(genDir); + CompilerUtil.refreshIODirectories(Arrays.asList(genDir)); final VirtualFile generatedVFile = LocalFileSystem.getInstance().findFileByIoFile(genDir); if (generatedVFile != null) { AndroidUtils.collectFiles(generatedVFile, visited, generatedVFiles); diff --git a/plugins/android/src/org/jetbrains/android/dom/AndroidClassTagDescriptor.java b/plugins/android/src/org/jetbrains/android/dom/AndroidClassTagDescriptor.java index 97257b955cb9..61aaee5f4f28 100644 --- a/plugins/android/src/org/jetbrains/android/dom/AndroidClassTagDescriptor.java +++ b/plugins/android/src/org/jetbrains/android/dom/AndroidClassTagDescriptor.java @@ -86,6 +86,11 @@ public class AndroidClassTagDescriptor implements XmlElementDescriptor { return myParentDescriptor.getContentType(); } + @Override + public String getDefaultValue() { + return null; + } + public PsiElement getDeclaration() { return myClass; } diff --git a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java index 275462f19ade..7e59f24e7716 100644 --- a/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java +++ b/plugins/android/src/org/jetbrains/android/run/AndroidRunningState.java @@ -79,7 +79,7 @@ public abstract class AndroidRunningState implements RunProfileState, AndroidDeb @NonNls private static final String ANDROID_TARGET_DEVICES_PROPERTY = "AndroidTargetDevices"; private static final IDevice[] EMPTY_DEVICE_ARRAY = new IDevice[0]; - public static final int WAITING_TIME = 10; + public static final int WAITING_TIME = 20; private static final Pattern FAILURE = Pattern.compile("Failure\\s+\\[(.*)\\]"); private static final Pattern TYPED_ERROR = Pattern.compile("Error\\s+[Tt]ype\\s+(\\d+).*"); diff --git a/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowManager.java b/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowManager.java index 2d1f6473a338..b9621ac033ba 100644 --- a/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowManager.java +++ b/plugins/android/src/org/jetbrains/android/uipreview/AndroidLayoutPreviewToolWindowManager.java @@ -281,7 +281,7 @@ public class AndroidLayoutPreviewToolWindowManager implements ProjectComponent { public void render() { ApplicationManager.getApplication().assertIsDispatchThread(); - if (!myToolWindow.isVisible()) { + if (myToolWindow == null || !myToolWindow.isVisible()) { return; } diff --git a/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/javacvsImpl/io/LineReader.java b/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/javacvsImpl/io/LineReader.java index f5e640c42d2d..d26b67082ed8 100644 --- a/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/javacvsImpl/io/LineReader.java +++ b/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/javacvsImpl/io/LineReader.java @@ -76,6 +76,10 @@ public class LineReader { @Nullable public byte[] readLine() throws IOException { if (myBytesBuffered == -1) { + if (myLastEol != 0) { + myLastEol = 0; + return getLineArray(); + } return null; } else if (myPosition >= myBytesBuffered) { fillBuffer(); diff --git a/plugins/devkit/devkit.iml b/plugins/devkit/devkit.iml index 663a7230c0aa..996d0202eb8c 100644 --- a/plugins/devkit/devkit.iml +++ b/plugins/devkit/devkit.iml @@ -24,7 +24,6 @@ - diff --git a/plugins/git4idea/src/git4idea/GitVcs.java b/plugins/git4idea/src/git4idea/GitVcs.java index d36b7a764bfb..960ae602b6b9 100644 --- a/plugins/git4idea/src/git4idea/GitVcs.java +++ b/plugins/git4idea/src/git4idea/GitVcs.java @@ -46,7 +46,7 @@ import com.intellij.openapi.vcs.rollback.RollbackEnvironment; import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; import com.intellij.openapi.vcs.update.UpdateEnvironment; import com.intellij.openapi.vcs.versionBrowser.CommittedChangeList; -import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.StatusBar; import com.intellij.openapi.wm.WindowManager; @@ -73,7 +73,9 @@ import git4idea.rollback.GitRollbackEnvironment; import git4idea.status.GitChangeProvider; import git4idea.ui.branch.GitBranchWidget; import git4idea.update.GitUpdateEnvironment; -import git4idea.vfs.*; +import git4idea.vfs.GitRootTracker; +import git4idea.vfs.GitRootsListener; +import git4idea.vfs.GitVFSListener; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -119,15 +121,10 @@ public class GitVcs extends AbstractVcs { private GitRootTracker myRootTracker; // The tracker that checks validity of git roots private final EventDispatcher myRootListeners = EventDispatcher.create(GitRootsListener.class); - private final EventDispatcher myConfigListeners = EventDispatcher.create(GitConfigListener.class); - private final EventDispatcher myReferenceListeners = EventDispatcher.create(GitReferenceListener.class); - private GitConfigTracker myConfigTracker; private final BackgroundTaskQueue myTaskQueue; // The queue that is used to schedule background task from actions private final ReadWriteLock myCommandLock = new ReentrantReadWriteLock(true); // The command read/write lock private final TreeDiffProvider myTreeDiffProvider; private final GitCommitAndPushExecutor myCommitAndPushExecutor; - private GitReferenceTracker myReferenceTracker; - private boolean isActivated; // If true, the vcs was activated private final GitExecutableValidator myExecutableValidator; private GitBranchWidget myBranchWidget; @@ -167,20 +164,11 @@ public class GitVcs extends AbstractVcs { myOutgoingChangesProvider = new GitOutgoingChangesProvider(myProject); myTreeDiffProvider = new GitTreeDiffProvider(myProject); myCommitAndPushExecutor = new GitCommitAndPushExecutor(myCheckinEnvironment); - myReferenceTracker = new GitReferenceTracker(myProject, this, myReferenceListeners.getMulticaster()); myTaskQueue = new BackgroundTaskQueue(myProject, GitBundle.getString("task.queue.title")); myExecutableValidator = new GitExecutableValidator(myProject, this); } - public BackgroundTaskQueue getTaskQueue() { - return myTaskQueue; - } - - public GitVFSListener getVFSListener() { - return myVFSListener; - } - public ReadWriteLock getCommandLock() { return myCommandLock; } @@ -196,30 +184,6 @@ public class GitVcs extends AbstractVcs { } } - public void addGitConfigListener(GitConfigListener listener) { - myConfigListeners.addListener(listener); - } - - public void removeGitConfigListener(GitConfigListener listener) { - myConfigListeners.removeListener(listener); - } - - public void addGitReferenceListener(GitReferenceListener listener) { - myReferenceListeners.addListener(listener); - } - - public void removeGitReferenceListener(GitReferenceListener listener) { - myReferenceListeners.removeListener(listener); - } - - public void addGitRootsListener(GitRootsListener listener) { - myRootListeners.addListener(listener); - } - - public void removeGitRootsListener(GitRootsListener listener) { - myRootListeners.removeListener(listener); - } - /** * @return a reverse merge provider for git (with reversed meaning of "theirs" and "yours", needed for the rebase and unstash) */ @@ -298,10 +262,9 @@ public class GitVcs extends AbstractVcs { return myRevSelector; } - @SuppressWarnings({"deprecation"}) @Override @Nullable - public VcsRevisionNumber parseRevisionNumber(String revision, FilePath path) throws VcsException { + public VcsRevisionNumber parseRevisionNumber(@Nullable String revision, @Nullable FilePath path) throws VcsException { if (revision == null || revision.length() == 0) return null; if (revision.length() > 40) { // date & revision-id encoded string String dateString = revision.substring(0, revision.indexOf("[")); @@ -323,10 +286,9 @@ public class GitVcs extends AbstractVcs { } - @SuppressWarnings({"deprecation"}) @Override @Nullable - public VcsRevisionNumber parseRevisionNumber(String revision) throws VcsException { + public VcsRevisionNumber parseRevisionNumber(@Nullable String revision) throws VcsException { return parseRevisionNumber(revision, null); } @@ -345,8 +307,6 @@ public class GitVcs extends AbstractVcs { @Override protected void activate() { - isActivated = true; - if (!ApplicationManager.getApplication().isHeadlessEnvironment()) { if (myExecutableValidator.checkExecutableAndNotifyIfNeeded()) { checkVersion(); @@ -359,10 +319,6 @@ public class GitVcs extends AbstractVcs { if (myVFSListener == null) { myVFSListener = new GitVFSListener(myProject, this); } - if (myConfigTracker == null) { - myConfigTracker = new GitConfigTracker(myProject, this, myConfigListeners.getMulticaster()); - } - myReferenceTracker.activate(); NewGitUsersComponent.getInstance(myProject).activate(); GitProjectLogManager.getInstance(myProject).activate(); @@ -378,7 +334,6 @@ public class GitVcs extends AbstractVcs { @Override protected void deactivate() { - isActivated = false; if (myRootTracker != null) { myRootTracker.dispose(); myRootTracker = null; @@ -387,11 +342,6 @@ public class GitVcs extends AbstractVcs { Disposer.dispose(myVFSListener); myVFSListener = null; } - if (myConfigTracker != null) { - myConfigTracker.dispose(); - myConfigTracker = null; - } - myReferenceTracker.deactivate(); NewGitUsersComponent.getInstance(myProject).deactivate(); GitProjectLogManager.getInstance(myProject).deactivate(); @@ -422,7 +372,7 @@ public class GitVcs extends AbstractVcs { */ public void showErrors(@NotNull List list, @NotNull String action) { if (list.size() > 0) { - StringBuffer buffer = new StringBuffer(); + StringBuilder buffer = new StringBuilder(); buffer.append("\n"); buffer.append(GitBundle.message("error.list.title", action)); for (final VcsException exception : list) { @@ -447,11 +397,6 @@ public class GitVcs extends AbstractVcs { showMessage(message, ConsoleViewContentType.NORMAL_OUTPUT.getAttributes()); } - @NotNull - public GitVcsApplicationSettings getAppSettings() { - return myAppSettings; - } - /** * Show message in the Version Control Console * @param message a message to show @@ -531,7 +476,7 @@ public class GitVcs extends AbstractVcs { final S sParent = in.get(j); final VirtualFile parent = convertor.convert(sParent); // the method check both that parent is an ancestor of the child and that they share common git root - if (VfsUtil.isAncestor(parent, child, false) && VfsUtil.isAncestor(childRoot, parent, false)) { + if (VfsUtilCore.isAncestor(parent, child, false) && VfsUtilCore.isAncestor(childRoot, parent, false)) { in.remove(i); //noinspection AssignmentToForLoopParameter --i; @@ -578,10 +523,6 @@ public class GitVcs extends AbstractVcs { return Collections.singletonList(myCommitAndPushExecutor); } - public boolean isActivated() { - return isActivated; - } - @NotNull public GitExecutableValidator getExecutableValidator() { return myExecutableValidator; diff --git a/plugins/git4idea/src/git4idea/actions/GitRebaseActionBase.java b/plugins/git4idea/src/git4idea/actions/GitRebaseActionBase.java index 09b0a44e6225..cc692911cb96 100644 --- a/plugins/git4idea/src/git4idea/actions/GitRebaseActionBase.java +++ b/plugins/git4idea/src/git4idea/actions/GitRebaseActionBase.java @@ -19,8 +19,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vfs.VirtualFile; -import git4idea.commands.GitHandlerUtil; -import git4idea.commands.GitLineHandler; +import git4idea.commands.*; import git4idea.i18n.GitBundle; import git4idea.rebase.GitInteractiveRebaseEditorHandler; import git4idea.rebase.GitRebaseEditorService; @@ -51,51 +50,58 @@ public abstract class GitRebaseActionBase extends GitRepositoryAction { } final VirtualFile root = h.workingDirectoryFile(); GitRebaseEditorService service = GitRebaseEditorService.getInstance(); - GitInteractiveRebaseEditorHandler editor = new GitInteractiveRebaseEditorHandler(service, project, root, h); - GitRebaseLineListener resultListener = new GitRebaseLineListener(); + final GitInteractiveRebaseEditorHandler editor = new GitInteractiveRebaseEditorHandler(service, project, root, h); + final GitRebaseLineListener resultListener = new GitRebaseLineListener(); h.addLineListener(resultListener); configureEditor(editor); affectedRoots.add(root); - try { - service.configureHandler(h, editor.getHandlerNo()); - GitHandlerUtil.doSynchronously(h, GitBundle.getString("rebasing.title"), h.printableCommandLine(), false); - } - finally { - editor.close(); - GitRepositoryManager.getInstance(project).updateRepository(root, GitRepository.TrackedTopic.ALL_CURRENT); - final GitRebaseLineListener.Result result = resultListener.getResult(); - String messageId; - boolean isError = true; - switch (result.status) { - case CONFLICT: - messageId = "rebase.result.conflict"; - break; - case ERROR: - messageId = "rebase.result.error"; - break; - case CANCELLED: - isError = false; - messageId = "rebase.result.cancelled"; - // we do not need to show a message if editing was cancelled. - exceptions.clear(); - break; - case EDIT: - isError = false; - messageId = "rebase.result.amend"; - break; - case FINISHED: - default: - messageId = null; + + service.configureHandler(h, editor.getHandlerNo()); + GitTask task = new GitTask(project, h, GitBundle.getString("rebasing.title")); + task.executeInBackground(false, new GitTaskResultHandlerAdapter() { + @Override + protected void run(GitTaskResult taskResult) { + editor.close(); + GitRepositoryManager.getInstance(project).updateRepository(root, GitRepository.TrackedTopic.ALL_CURRENT); + notifyAboutErrorResult(taskResult, resultListener, exceptions, project); } - if (messageId != null) { - String message = GitBundle.message(messageId, result.current, result.total); - String title = GitBundle.message(messageId + ".title"); - if (isError) { - Messages.showErrorDialog(project, message, title); - } - else { - Messages.showInfoMessage(project, message, title); - } + }); + } + + private static void notifyAboutErrorResult(GitTaskResult taskResult, GitRebaseLineListener resultListener, List exceptions, Project project) { + if (taskResult == GitTaskResult.CANCELLED) { + return; + } + final GitRebaseLineListener.Result result = resultListener.getResult(); + String messageId; + boolean isError = true; + switch (result.status) { + case CONFLICT: + messageId = "rebase.result.conflict"; + break; + case ERROR: + messageId = "rebase.result.error"; + break; + case CANCELLED: + // we do not need to show a message if editing was cancelled. + exceptions.clear(); + return; + case EDIT: + isError = false; + messageId = "rebase.result.amend"; + break; + case FINISHED: + default: + messageId = null; + } + if (messageId != null) { + String message = GitBundle.message(messageId, result.current, result.total); + String title = GitBundle.message(messageId + ".title"); + if (isError) { + Messages.showErrorDialog(project, message, title); + } + else { + Messages.showInfoMessage(project, message, title); } } } diff --git a/plugins/git4idea/src/git4idea/history/wholeTree/GitLogUI.java b/plugins/git4idea/src/git4idea/history/wholeTree/GitLogUI.java index e8332a066c26..ec751740f29c 100644 --- a/plugins/git4idea/src/git4idea/history/wholeTree/GitLogUI.java +++ b/plugins/git4idea/src/git4idea/history/wholeTree/GitLogUI.java @@ -13,6 +13,7 @@ package git4idea.history.wholeTree; import com.intellij.ide.DataManager; +import com.intellij.ide.actions.ContextHelpAction; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.impl.SimpleDataContext; @@ -21,14 +22,12 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.diff.impl.CaptionIcon; import com.intellij.openapi.diff.impl.patch.formove.FilePathComparator; +import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.ide.CopyPasteManager; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.MessageType; -import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.ui.MultiLineLabelUI; -import com.intellij.openapi.ui.Splitter; +import com.intellij.openapi.ui.*; import com.intellij.openapi.ui.popup.*; import com.intellij.openapi.util.*; import com.intellij.openapi.util.text.StringUtil; @@ -892,6 +891,7 @@ public class GitLogUI implements Disposable { myMyGotoCommitAction = new MyGotoCommitAction(); group.add(myMyGotoCommitAction); group.add(myRefreshAction); + group.add(new ContextHelpAction("reference.changesToolWindow.log")); //group.add(new TestIndexAction()); myMoreAction = new MoreAction() { diff --git a/plugins/git4idea/src/git4idea/vfs/GitConfigTracker.java b/plugins/git4idea/src/git4idea/vfs/GitConfigTracker.java deleted file mode 100644 index cb98be7a11c8..000000000000 --- a/plugins/git4idea/src/git4idea/vfs/GitConfigTracker.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright 2000-2009 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 git4idea.vfs; - -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vcs.ProjectLevelVcsManager; -import com.intellij.openapi.vfs.*; -import com.intellij.util.containers.HashSet; -import com.intellij.vcsUtil.VcsFileUtil; -import git4idea.GitUtil; -import git4idea.GitVcs; -import org.jetbrains.annotations.Nullable; - -import java.util.Arrays; -import java.util.Iterator; -import java.util.Set; - -/** - * The tracker for configuration files, it tracks the following events: - *

    - *
  • Changes in configuration files: .git/config and ~/.gitconfig
  • - *
- * The tracker assumes that git roots are configured correctly. - */ -public class GitConfigTracker implements GitRootsListener { - /** - * The context project - */ - private final Project myProject; - /** - * The vcs object - */ - private final GitVcs myVcs; - /** - * The vcs manager that tracks content roots - */ - private final ProjectLevelVcsManager myVcsManager; - /** - * The listener collection (managed by GitVcs object since lifetime of this object is less than lifetime of GitVcs) - */ - private final GitConfigListener myMulticaster; - /** - * The appeared roots that has been already reported as changed - */ - private final HashSet myReportedRoots = new HashSet(); - /** - * Local file system service - */ - private final LocalFileSystem myLocalFileSystem; - /** - * The file listener - */ - private final MyFileListener myFileListener; - - /** - * The constructor - * - * @param project the context project - * @param vcs the vcs object - * @param multicaster the listener collection to use - */ - public GitConfigTracker(Project project, GitVcs vcs, GitConfigListener multicaster) { - myProject = project; - myVcs = vcs; - myMulticaster = multicaster; - myLocalFileSystem = LocalFileSystem.getInstance(); - myVcsManager = ProjectLevelVcsManager.getInstance(project); - myVcs.addGitRootsListener(this); - myFileListener = new MyFileListener(); - VirtualFileManager.getInstance().addVirtualFileListener(myFileListener); - gitRootsChanged(); - } - - /** - * This method is invoked when set of configured roots changed. - */ - public void gitRootsChanged() { - VirtualFile[] contentRoots = myVcsManager.getRootsUnderVcs(myVcs); - if (contentRoots == null || contentRoots.length == 0) { - return; - } - Set currentRootSet = GitUtil.gitRootsForPaths(Arrays.asList(contentRoots)); - HashSet newRoots = new HashSet(currentRootSet); - synchronized (myReportedRoots) { - for (Iterator i = myReportedRoots.iterator(); i.hasNext();) { - VirtualFile root = i.next(); - if (!root.isValid()) { - i.remove(); - } - } - newRoots.removeAll(myReportedRoots); - myReportedRoots.clear(); - myReportedRoots.addAll(currentRootSet); - } - for (VirtualFile root : newRoots) { - VirtualFile config = root.findFileByRelativePath(".git/config"); - myMulticaster.configChanged(root, config); - } - // visit user home directory in order to notice .gitconfig changes later - VirtualFile userHome = getUserHome(); - if (userHome != null) { - userHome.getChildren(); - } - } - - /** - * @return user home directory - */ - @Nullable - private VirtualFile getUserHome() { - return myLocalFileSystem.findFileByPath(System.getProperty("user.home")); - } - - - /** - * Dispose the tracker removing all registered listeners - */ - public void dispose() { - myVcs.removeGitRootsListener(this); - VirtualFileManager.getInstance().removeVirtualFileListener(myFileListener); - } - - - /** - * The listener for the file system that checks if the configuration files are changed. - * Note that events are checked in quite a shallow form. More radical events will cause - * remapping of git roots and gitRootsChanged() event will be delivered. - */ - private class MyFileListener extends VirtualFileAdapter { - - /** - * Check if the event affects configuration files in registered roots - * - * @param file the file to check - */ - private void checkConfigAffected(VirtualFile file) { - if (file.getName().equals(".gitconfig")) { - VirtualFile userHome = getUserHome(); - VirtualFile parent = file.getParent(); - if (userHome != null && parent != null && parent.equals(userHome)) { - HashSet allRoots; - synchronized (myReportedRoots) { - allRoots = new HashSet(myReportedRoots); - } - for (VirtualFile root : allRoots) { - myMulticaster.configChanged(root, file); - } - } - return; - } - VirtualFile base = VcsFileUtil.getPossibleBase(file, ".git", "config"); - if (base != null) { - boolean reported; - synchronized (myReportedRoots) { - reported = myReportedRoots.contains(base); - } - if (reported) { - myMulticaster.configChanged(base, file); - } - } - } - - /** - * {@inheritDoc} - */ - @Override - public void fileCreated(VirtualFileEvent event) { - checkConfigAffected(event.getFile()); - } - - /** - * {@inheritDoc} - */ - @Override - public void beforeFileDeletion(VirtualFileEvent event) { - checkConfigAffected(event.getFile()); - } - - /** - * {@inheritDoc} - */ - @Override - public void contentsChanged(VirtualFileEvent event) { - checkConfigAffected(event.getFile()); - } - - /** - * {@inheritDoc} - */ - @Override - public void fileCopied(VirtualFileCopyEvent event) { - super.fileCopied(event); - } - - /** - * {@inheritDoc} - */ - @Override - public void fileMoved(VirtualFileMoveEvent event) { - String fileName = event.getFileName(); - VirtualFile newParent = event.getNewParent(); - VirtualFile oldParent = event.getOldParent(); - if (fileName.equals("config")) { - checkParent(newParent); - checkParent(oldParent); - } - if (fileName.equals(".gitconfig")) { - VirtualFile userHome = getUserHome(); - if (userHome != null && (newParent.equals(userHome) || oldParent.equals(userHome))) { - HashSet allRoots; - synchronized (myReportedRoots) { - allRoots = new HashSet(myReportedRoots); - } - VirtualFile config = userHome.findChild(".gitconfig"); - for (VirtualFile root : allRoots) { - myMulticaster.configChanged(root, config); - } - } - } - } - - /** - * Check parent and report event if it is one of reported roots - * - * @param parent the parent to check - */ - private void checkParent(VirtualFile parent) { - if (parent.getName().equals(".git")) { - VirtualFile base = parent.getParent(); - if (base != null) { - boolean reported; - synchronized (myReportedRoots) { - reported = myReportedRoots.contains(base); - } - if (reported) { - myMulticaster.configChanged(base, parent.findChild("config")); - } - } - } - } - } -} diff --git a/plugins/git4idea/src/git4idea/vfs/GitReferenceTracker.java b/plugins/git4idea/src/git4idea/vfs/GitReferenceTracker.java deleted file mode 100644 index 44d726b04ccf..000000000000 --- a/plugins/git4idea/src/git4idea/vfs/GitReferenceTracker.java +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright 2000-2010 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 git4idea.vfs; - -import com.intellij.openapi.project.Project; -import com.intellij.openapi.vcs.VcsException; -import com.intellij.openapi.vfs.*; -import com.intellij.util.containers.HashSet; -import git4idea.GitUtil; -import git4idea.GitVcs; - -import java.util.*; -import java.util.concurrent.atomic.AtomicReference; - -/** - * The tracker for the git references - */ -public class GitReferenceTracker { - /** - * The root references that must be tracked - */ - private static final Set myRootReferences = new HashSet(); - - static { - myRootReferences.add("HEAD"); - myRootReferences.add("refs"); - myRootReferences.add("MERGE_HEAD"); - // note, they are here intentionally, since their presence changes the way HEAD is interpreted - myRootReferences.add("rebase_merge"); - myRootReferences.add("rebase_apply"); - } - - /** - * The context project - */ - private final Project myProject; - /** - * The vcs instance that requested the tracking - */ - private final GitVcs myVcs; - /** - * The event multicaster - */ - private final GitReferenceListener myListener; - /** - * The listener for vcs roots - */ - private final GitRootsListener myRootsListener; - /** - * The list of git roots - */ - private final AtomicReference> myGitRoots = - new AtomicReference>(Collections.emptyList()); - /** - * The list of git roots - */ - private final AtomicReference myState = new AtomicReference(State.DEACTIVATED); - /** - * File system listener - */ - private final MyVfsListener myVfsListener; - - /** - * The reference tracker - * - * @param project the project - * @param vcs the vcs that created tracker - * @param listener the listener to use for notifications (multicaster is expected) - */ - public GitReferenceTracker(Project project, GitVcs vcs, GitReferenceListener listener) { - myProject = project; - myVcs = vcs; - myListener = listener; - myVfsListener = new MyVfsListener(); - myRootsListener = new GitRootsListener() { - @Override - public void gitRootsChanged() { - checkRoots(); - } - }; - } - - /** - * Start listening for events - */ - public void activate() { - if (!myState.compareAndSet(State.DEACTIVATED, State.ACTIVATED)) { - return; - } - if (myProject.isDefault()) { - return; - } - checkRoots(); - LocalFileSystem.getInstance().addVirtualFileListener(myVfsListener); - myVcs.addGitRootsListener(myRootsListener); - } - - /** - * Deactivate service - */ - public void deactivate() { - if (!myState.compareAndSet(State.ACTIVATED, State.DEACTIVATED)) { - return; - } - removeListeners(); - } - - /** - * Remove listeners from services - */ - private void removeListeners() { - myVcs.removeGitRootsListener(myRootsListener); - LocalFileSystem.getInstance().removeVirtualFileListener(myVfsListener); - } - - /** - * Dispose the tracker removing all listeners - */ - public void dispose() { - if (myState.getAndSet(State.DISPOSED) != State.ACTIVATED) { - return; - } - removeListeners(); - } - - /** - * Visit roots so file listener will be modified if special status changed - */ - private void checkRoots() { - try { - List roots = GitUtil.getGitRoots(myProject, myVcs); - myGitRoots.set(roots); - for (VirtualFile root : roots) { - final VirtualFile git = root.findChild(".git"); - if (git != null) { - for (String name : myRootReferences) { - final VirtualFile child = git.findChild(name); - if (child != null) { - child.getTimeStamp(); - } - } - final VirtualFile infoRefs = root.findFileByRelativePath("info/refs"); - if (infoRefs != null) { - infoRefs.getTimeStamp(); - } - visitRecursively(git.findChild("refs")); - } - } - notifyChanges(null); - } - catch (VcsException e) { - myGitRoots.set(Collections.emptyList()); - } - } - - private void notifyChanges(VirtualFile root) { - myListener.referencesChanged(root); - } - - /** - * Visit recursively - * - * @param child the child directory to visit - */ - private static void visitRecursively(VirtualFile child) { - if (child == null) { - return; - } - child.getTimeStamp(); - LinkedList toVisit = new LinkedList(); - toVisit.add(child); - while (!toVisit.isEmpty()) { - VirtualFile file = toVisit.removeLast(); - if (file.isValid() && file.isDirectory()) { - toVisit.addAll(Arrays.asList(file.getChildren())); - } - } - } - - /** - * The listener for vfs events - */ - class MyVfsListener extends VirtualFileAdapter { - - @Override - public void contentsChanged(VirtualFileEvent event) { - checkFile(event.getParent(), event.getFileName()); - } - - @Override - public void fileCreated(VirtualFileEvent event) { - checkFile(event.getParent(), event.getFileName()); - } - - @Override - public void fileDeleted(VirtualFileEvent event) { - checkFile(event.getParent(), event.getFileName()); - } - - @Override - public void fileMoved(VirtualFileMoveEvent event) { - checkFile(event.getNewParent(), event.getFileName()); - checkFile(event.getOldParent(), event.getFileName()); - } - - @Override - public void fileCopied(VirtualFileCopyEvent event) { - checkFile(event.getParent(), event.getFileName()); - } - - @Override - public void propertyChanged(VirtualFilePropertyEvent event) { - if (event.getPropertyName() == VirtualFile.PROP_NAME) { - checkFile(event.getParent(), (String)event.getOldValue()); - checkFile(event.getParent(), (String)event.getNewValue()); - } - } - - /** - * Check if the file change might affect reference mapping - * - * @param parent the file parent to check - * @param name the name check - */ - private void checkFile(VirtualFile parent, String name) { - VirtualFile git = parent; - while (git != null && !git.getName().equals(".git")) { - git = git.getParent(); - } - if (git == null) { - return; - } - if (parent == git && myRootReferences.contains(name)) { - notifyChanges(git.getParent()); - } - else if (parent.getParent() == git && name.equals("refs") && parent.getName().equals("info")) { - notifyChanges(git.getParent()); - } - else { - while (parent != null && parent.getParent() != git) { - parent = parent.getParent(); - } - if (parent != null && parent.isDirectory() && parent.getName().equals("refs")) { - notifyChanges(git.getParent()); - } - } - } - } - - /** - * The component state - */ - private enum State { - /** - * Initial state - */ - DEACTIVATED, - /** - * Started state - */ - ACTIVATED, - /** - * Disposed - */ - DISPOSED - } -} diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml index a51cfa089efb..0bf08464e550 100644 --- a/plugins/groovy/src/META-INF/plugin.xml +++ b/plugins/groovy/src/META-INF/plugin.xml @@ -233,7 +233,7 @@ implementationClass="org.jetbrains.plugins.groovy.codeInsight.GroovyLineMarkerProvider"/> - + ", this); - //in case of anonymous class this code don't matter because anonymous classes can't have static methods + final JavaPsiFacade facade = JavaPsiFacade.getInstance(context.getProject()); + PsiElementFactory elementFactory = facade.getElementFactory(); + + if (!PsiUtil.isInStaticContext(this)) return elementFactory.createType(context); + + //create instance of java.lang.Class + if (context instanceof PsiAnonymousClass) { + final PsiClassType type = ((PsiAnonymousClass)context).getBaseClassType(); + final PsiClass aClass = + facade.findClass(CommonClassNames.JAVA_LANG_CLASS, context.getResolveScope()); + if (aClass != null) { + return elementFactory.createType(aClass, type); + } + else { + return elementFactory.createTypeFromText(CommonClassNames.JAVA_LANG_CLASS + "<" + type.getCanonicalText() + ">", this); + } } - return elementFactory.createType(context); + return elementFactory.createTypeFromText(CommonClassNames.JAVA_LANG_CLASS + "<" + context.getName() + ">", this); } @NotNull diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.groovy index 76ade3fc24a0..3b76f85a3299 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/GroovyHighlightingTest.groovy @@ -538,4 +538,21 @@ class Bar {{ void testOctalInspection() { doTest(new GroovyOctalIntegerInspection()) } + + void testThisInStaticMethodOfAnonymousClass() { + myFixture.configureByText('a.groovy', '''\ +class A { + static abc + def foo() { + new Runnable() { + static void run() { + print this.@abc + } + }.run() + } +}''') + + myFixture.enableInspections(GroovyAssignabilityCheckInspection) + myFixture.checkHighlighting(true, false, false); + } } \ No newline at end of file diff --git a/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/actions/CopyAction.java b/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/actions/CopyAction.java index c5a2f9c4f50a..6f2e50c36d2f 100644 --- a/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/actions/CopyAction.java +++ b/plugins/svn4ideaOld/src/org/jetbrains/idea/svn/actions/CopyAction.java @@ -18,6 +18,7 @@ package org.jetbrains.idea.svn.actions; import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; @@ -163,15 +164,9 @@ public class CopyAction extends BasicAction { } }; - final Task.Backgroundable task = - new Task.Backgroundable(project, "Checking target folder", false, BackgroundFromStartOption.getInstance()) { - - public void run(@NotNull ProgressIndicator indicator) { - taskImpl.run(); - } - }; - if (ApplicationManager.getApplication().isDispatchThread()) { - ProgressManager.getInstance().run(task); + final Application application = ApplicationManager.getApplication(); + if (application.isDispatchThread()) { + ProgressManager.getInstance().runProcessWithProgressSynchronously(taskImpl, "Checking target folder", true, project); } else { taskImpl.run(); } diff --git a/plugins/tasks/tasks-tests/tasks-tests.iml b/plugins/tasks/tasks-tests/tasks-tests.iml index a9e1beff04c1..f59b8dfccb7e 100644 --- a/plugins/tasks/tasks-tests/tasks-tests.iml +++ b/plugins/tasks/tasks-tests/tasks-tests.iml @@ -14,7 +14,6 @@ - diff --git a/resources-en/src/messages/DebuggerBundle.properties b/resources-en/src/messages/DebuggerBundle.properties index d820b639d363..1e872a490d1e 100644 --- a/resources-en/src/messages/DebuggerBundle.properties +++ b/resources-en/src/messages/DebuggerBundle.properties @@ -181,6 +181,7 @@ label.base.renderer.configurable.hide.null.array.elements=Hide &null array eleme label.base.renderer.configurable.show.static.fields=&Static fields label.base.renderer.configurable.show.static.final.fields=Static &final fields label.base.renderer.configurable.show.declared.type=Declared &type +label.base.renderer.configurable.show.fq.names=Fully &qualified names label.base.renderer.configurable.show.object.id=Object &id label.base.renderer.configurable.alternate.view=Enable alternative view for Coll&ections classes label.base.renderer.configurable.enable.tostring=Enable 't&oString()' object view: diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 5f56a92b7bc2..b9f550bbbd55 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -210,7 +210,7 @@ + order="first, before javaMemberName, after liveTemplates"/> \n"); - XmlFile tempFile; + buffer.append("\n"); + XmlFile tempFile; try{ final XmlProlog prolog = document.getProlog(); final PsiElement childOfType = PsiTreeUtil.getChildOfType(prolog, XmlProcessingInstruction.class); @@ -65,9 +66,8 @@ public class GenerateDTDAction extends BaseCodeInsightAction{ tempFile = (XmlFile)PsiFileFactory.getInstance(file.getProject()).createFileFromText("dummy.xml", buffer.toString()); prolog.replace(tempFile.getDocument().getProlog()); } - catch(IncorrectOperationException e){ - LOG.error(e); - } + catch (IncorrectOperationException e) { + LOG.error(e); } } } @@ -78,6 +78,20 @@ public class GenerateDTDAction extends BaseCodeInsightAction{ }; } + @Nullable + private static XmlDocument findSuitableXmlDocument(@Nullable PsiFile psiFile) { + if (psiFile instanceof XmlFile) { + final VirtualFile virtualFile = psiFile.getVirtualFile(); + if (virtualFile != null && virtualFile.isWritable()) { + final XmlDocument document = ((XmlFile)psiFile).getDocument(); + if (document != null && document.getRootTag() != null) { + return document; + } + } + } + return null; + } + public void update(AnActionEvent event) { super.update(event); @@ -89,7 +103,7 @@ public class GenerateDTDAction extends BaseCodeInsightAction{ final boolean enabled; if (editor != null && project != null) { PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument()); - enabled = file instanceof XmlFile; + enabled = findSuitableXmlDocument(file) != null; } else { enabled = false; diff --git a/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java b/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java index a63e79ad3075..29bac4033e11 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java +++ b/xml/impl/src/com/intellij/codeInsight/template/zencoding/ZenCodingTemplate.java @@ -21,6 +21,7 @@ import com.intellij.codeInsight.template.*; import com.intellij.codeInsight.template.impl.TemplateImpl; import com.intellij.codeInsight.template.impl.TemplateState; import com.intellij.codeInsight.template.zencoding.filters.ZenCodingFilter; +import com.intellij.codeInsight.template.zencoding.generators.XmlZenCodingGenerator; import com.intellij.codeInsight.template.zencoding.generators.ZenCodingGenerator; import com.intellij.codeInsight.template.zencoding.nodes.*; import com.intellij.codeInsight.template.zencoding.tokens.*; @@ -145,9 +146,24 @@ public class ZenCodingTemplate implements CustomLiveTemplate { if (tokens == null) { return null; } + if (generator != null && !validate(tokens, generator)) { + return null; + } MyParser parser = new MyParser(tokens, callback, generator); ZenCodingNode node = parser.parse(); - return parser.myIndex == tokens.size() ? node : null; + if (parser.myIndex != tokens.size() || node instanceof TextNode) { + return null; + } + return node; + } + + private static boolean validate(@NotNull List tokens, @NotNull ZenCodingGenerator generator) { + for (ZenCodingToken token : tokens) { + if (token instanceof TextToken && !(generator instanceof XmlZenCodingGenerator)) { + return false; + } + } + return true; } @Nullable diff --git a/xml/impl/src/com/intellij/xml/impl/dtd/BaseXmlElementDescriptorImpl.java b/xml/impl/src/com/intellij/xml/impl/dtd/BaseXmlElementDescriptorImpl.java index ef09d3b7ff72..6d01ce8bc65f 100644 --- a/xml/impl/src/com/intellij/xml/impl/dtd/BaseXmlElementDescriptorImpl.java +++ b/xml/impl/src/com/intellij/xml/impl/dtd/BaseXmlElementDescriptorImpl.java @@ -41,6 +41,11 @@ public abstract class BaseXmlElementDescriptorImpl implements XmlElementDescript return null; } + @Override + public String getDefaultValue() { + return null; + } + // Read-only action protected abstract XmlElementDescriptor[] doCollectXmlDescriptors(final XmlTag context); diff --git a/xml/impl/src/com/intellij/xml/impl/schema/AnyXmlElementDescriptor.java b/xml/impl/src/com/intellij/xml/impl/schema/AnyXmlElementDescriptor.java index 36d06639dceb..7343adf58a01 100644 --- a/xml/impl/src/com/intellij/xml/impl/schema/AnyXmlElementDescriptor.java +++ b/xml/impl/src/com/intellij/xml/impl/schema/AnyXmlElementDescriptor.java @@ -101,4 +101,9 @@ public class AnyXmlElementDescriptor implements XmlElementDescriptor { public int getContentType() { return CONTENT_TYPE_UNKNOWN; } + + @Override + public String getDefaultValue() { + return null; + } } diff --git a/xml/impl/src/com/intellij/xml/impl/schema/NullElementDescriptor.java b/xml/impl/src/com/intellij/xml/impl/schema/NullElementDescriptor.java index fe0a58718236..3704042e0aaa 100644 --- a/xml/impl/src/com/intellij/xml/impl/schema/NullElementDescriptor.java +++ b/xml/impl/src/com/intellij/xml/impl/schema/NullElementDescriptor.java @@ -80,6 +80,11 @@ public class NullElementDescriptor implements XmlElementDescriptor { return 0; } + @Override + public String getDefaultValue() { + return null; + } + public PsiElement getDeclaration() { return null; } diff --git a/xml/impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java b/xml/impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java index 3baa1839a0f6..cda043cd5d9b 100644 --- a/xml/impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java +++ b/xml/impl/src/com/intellij/xml/impl/schema/XmlElementDescriptorImpl.java @@ -45,7 +45,7 @@ public class XmlElementDescriptorImpl implements XmlElementDescriptor, PsiWritab @NonNls private static final String ELEMENT_FORM_DEFAULT = "elementFormDefault"; - public XmlElementDescriptorImpl(XmlTag descriptorTag) { + public XmlElementDescriptorImpl(@Nullable XmlTag descriptorTag) { myDescriptorTag = descriptorTag; } @@ -358,6 +358,11 @@ public class XmlElementDescriptorImpl implements XmlElementDescriptor, PsiWritab return CONTENT_TYPE_MIXED; } + @Override + public String getDefaultValue() { + return myDescriptorTag.getAttributeValue("default"); + } + @Nullable public XmlElementDescriptor getElementDescriptor(final String name) { final String localName = XmlUtil.findLocalNameByQualifiedName(name); diff --git a/xml/openapi/src/com/intellij/xml/XmlElementDescriptor.java b/xml/openapi/src/com/intellij/xml/XmlElementDescriptor.java index 1b05741cb168..6627ca0e7eea 100644 --- a/xml/openapi/src/com/intellij/xml/XmlElementDescriptor.java +++ b/xml/openapi/src/com/intellij/xml/XmlElementDescriptor.java @@ -68,4 +68,7 @@ public interface XmlElementDescriptor extends PsiMetaData { int CONTENT_TYPE_ANY = 1; int CONTENT_TYPE_CHILDREN = 2; int CONTENT_TYPE_MIXED = 3; + + @Nullable + String getDefaultValue(); } diff --git a/xml/relaxng/src/org/intellij/html/RelaxedHtmlFromRngElementDescriptor.java b/xml/relaxng/src/org/intellij/html/RelaxedHtmlFromRngElementDescriptor.java index a56ee566e2fc..48fa59d514e4 100644 --- a/xml/relaxng/src/org/intellij/html/RelaxedHtmlFromRngElementDescriptor.java +++ b/xml/relaxng/src/org/intellij/html/RelaxedHtmlFromRngElementDescriptor.java @@ -84,6 +84,11 @@ public class RelaxedHtmlFromRngElementDescriptor implements XmlElementDescriptor return myDelegate.getContentType(); } + @Override + public String getDefaultValue() { + return null; + } + public XmlAttributeDescriptor getAttributeDescriptor(String attributeName, final XmlTag context) { final XmlAttributeDescriptor descriptor = myDelegate.getAttributeDescriptor(attributeName.toLowerCase(), context); if (descriptor != null) return descriptor; diff --git a/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngElementDescriptor.java b/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngElementDescriptor.java index 4e8b7a886996..054460f7c38d 100644 --- a/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngElementDescriptor.java +++ b/xml/relaxng/src/org/intellij/plugins/relaxNG/model/descriptors/RngElementDescriptor.java @@ -209,6 +209,11 @@ public class RngElementDescriptor implements XmlElementDescriptor { } } + @Override + public String getDefaultValue() { + return null; + } + public PsiElement getDeclaration() { if (myDeclaration != null) { final PsiElement element = myDeclaration.getElement();