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/ImageContentProvider.java b/images/src/org/intellij/images/editor/impl/ImageContentProvider.java
deleted file mode 100644
index 15ad1f54094c..000000000000
--- a/images/src/org/intellij/images/editor/impl/ImageContentProvider.java
+++ /dev/null
@@ -1,51 +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.Disposable;
-import com.intellij.openapi.vfs.VirtualFile;
-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);
-
- @Nullable
- VirtualFile getVirtualFile();
-
- long getFileLength();
-
-}
diff --git a/images/src/org/intellij/images/editor/impl/ImageEditorImpl.java b/images/src/org/intellij/images/editor/impl/ImageEditorImpl.java
index 374fdac87f6c..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
*/
-final 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 @@ final 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 @@ final 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 9c344f6f8a8a..da0f8f1c9a56 100644
--- a/images/src/org/intellij/images/editor/impl/ImageFileEditorProvider.java
+++ b/images/src/org/intellij/images/editor/impl/ImageFileEditorProvider.java
@@ -45,10 +45,7 @@ final class ImageFileEditorProvider implements FileEditorProvider, DumbAware {
@NotNull
public FileEditor createEditor(@NotNull Project project, @NotNull VirtualFile file) {
- ImageContentProvider contentProvider = new VirtualFileImageContentProvider(file);
- 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();
- }
- });
- }
- }
-}