blob: 581d7bb9b10e6badd5afaaf368085caa3379c1b7 [file] [log] [blame]
/*
* Copyright 2004-2005 Alexey Efimov
*
* 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.fileEditor.FileEditorManager;
import com.intellij.openapi.project.Project;
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 javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
/**
* Image viewer implementation.
*
* @author <a href="mailto:aefimov.box@gmail.com">Alexey Efimov</a>
*/
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 VirtualFile file) {
this.project = project;
this.file = file;
// Options
Options options = OptionsManager.getInstance().getOptions();
editorUI = new ImageEditorUI(this, options.getEditorOptions());
options.addPropertyChangeListener(optionsChangeListener);
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));
}
}
}
} catch (Exception e) {
// Error loading image file
document.setValue(null);
}
}
public boolean isValid() {
ImageDocument document = editorUI.getImageComponent().getDocument();
return document.getValue() != null;
}
public JComponent getComponent() {
return editorUI;
}
public JComponent getContentComponent() {
return editorUI.getImageComponent();
}
@NotNull
public VirtualFile getFile() {
return file;
}
@NotNull
public Project getProject() {
return project;
}
public ImageDocument getDocument() {
return editorUI.getImageComponent().getDocument();
}
public void setTransparencyChessboardVisible(boolean visible) {
editorUI.getImageComponent().setTransparencyChessboardVisible(visible);
editorUI.repaint();
}
public boolean isTransparencyChessboardVisible() {
return editorUI.getImageComponent().isTransparencyChessboardVisible();
}
public boolean isEnabledForActionPlace(String place) {
// Disable for thumbnails action
return !ThumbnailViewActions.ACTION_PLACE.equals(place);
}
public void setGridVisible(boolean visible) {
editorUI.getImageComponent().setGridVisible(visible);
editorUI.repaint();
}
public boolean isGridVisible() {
return editorUI.getImageComponent().isGridVisible();
}
public boolean isDisposed() {
return disposed;
}
public ImageZoomModel getZoomModel() {
return editorUI.getZoomModel();
}
public void dispose() {
Options options = OptionsManager.getInstance().getOptions();
options.removePropertyChangeListener(optionsChangeListener);
editorUI.dispose();
VirtualFileManager.getInstance().removeVirtualFileListener(this);
disposed = true;
}
public void propertyChanged(@NotNull 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(@NotNull 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) {
Options options = (Options) evt.getSource();
EditorOptions editorOptions = options.getEditorOptions();
TransparencyChessboardOptions chessboardOptions = editorOptions.getTransparencyChessboardOptions();
GridOptions gridOptions = editorOptions.getGridOptions();
ImageComponent imageComponent = editorUI.getImageComponent();
imageComponent.setTransparencyChessboardCellSize(chessboardOptions.getCellSize());
imageComponent.setTransparencyChessboardWhiteColor(chessboardOptions.getWhiteColor());
imageComponent.setTransparencyChessboardBlankColor(chessboardOptions.getBlackColor());
imageComponent.setGridLineZoomFactor(gridOptions.getLineZoomFactor());
imageComponent.setGridLineSpan(gridOptions.getLineSpan());
imageComponent.setGridLineColor(gridOptions.getLineColor());
}
}
}