8c23b10b0c6e0dbf3512237bd8abb1f18facbb01
[idea/community.git] / images / src / org / intellij / images / editor / impl / ImageEditorImpl.java
1 /*
2  * Copyright 2004-2005 Alexey Efimov
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.intellij.images.editor.impl;
17
18 import com.intellij.openapi.fileEditor.FileEditorManager;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.vfs.*;
21 import org.intellij.images.editor.ImageDocument;
22 import org.intellij.images.editor.ImageEditor;
23 import org.intellij.images.editor.ImageZoomModel;
24 import org.intellij.images.fileTypes.ImageFileTypeManager;
25 import org.intellij.images.thumbnail.actionSystem.ThumbnailViewActions;
26 import org.intellij.images.vfs.IfsUtil;
27 import org.jetbrains.annotations.NotNull;
28
29 import javax.swing.*;
30
31 /**
32  * Image viewer implementation.
33  *
34  * @author <a href="mailto:aefimov.box@gmail.com">Alexey Efimov</a>
35  */
36 final class ImageEditorImpl extends VirtualFileAdapter implements ImageEditor {
37     private final Project project;
38     private final VirtualFile file;
39     private final ImageEditorUI editorUI;
40     private boolean disposed;
41
42     ImageEditorImpl(@NotNull Project project, @NotNull VirtualFile file) {
43         this.project = project;
44         this.file = file;
45
46         editorUI = new ImageEditorUI(this);
47
48         VirtualFileManager.getInstance().addVirtualFileListener(this);
49
50         setValue(file);
51     }
52
53     private void setValue(VirtualFile file) {
54         try {
55             editorUI.setImage(IfsUtil.getImage(file), IfsUtil.getFormat(file));
56         }
57         catch (Exception e) {
58             //     Error loading image file
59             editorUI.setImage(null, null);
60         }
61     }
62
63     public boolean isValid() {
64         ImageDocument document = editorUI.getImageComponent().getDocument();
65         return document.getValue() != null;
66     }
67
68     public JComponent getComponent() {
69         return editorUI;
70     }
71
72     public JComponent getContentComponent() {
73         return editorUI.getImageComponent();
74     }
75
76     @NotNull
77     public VirtualFile getFile() {
78         return file;
79     }
80
81     @NotNull
82     public Project getProject() {
83         return project;
84     }
85
86     public ImageDocument getDocument() {
87         return editorUI.getImageComponent().getDocument();
88     }
89
90     public void setTransparencyChessboardVisible(boolean visible) {
91         editorUI.getImageComponent().setTransparencyChessboardVisible(visible);
92         editorUI.repaint();
93     }
94
95     public boolean isTransparencyChessboardVisible() {
96         return editorUI.getImageComponent().isTransparencyChessboardVisible();
97     }
98
99     public boolean isEnabledForActionPlace(String place) {
100         // Disable for thumbnails action
101         return !ThumbnailViewActions.ACTION_PLACE.equals(place);
102     }
103
104     public void setGridVisible(boolean visible) {
105         editorUI.getImageComponent().setGridVisible(visible);
106         editorUI.repaint();
107     }
108
109     public boolean isGridVisible() {
110         return editorUI.getImageComponent().isGridVisible();
111     }
112
113     public boolean isDisposed() {
114         return disposed;
115     }
116
117     public ImageZoomModel getZoomModel() {
118         return editorUI.getZoomModel();
119     }
120
121     public void dispose() {
122         editorUI.dispose();
123         VirtualFileManager.getInstance().removeVirtualFileListener(this);
124         disposed = true;
125     }
126
127     public void propertyChanged(@NotNull VirtualFilePropertyEvent event) {
128         super.propertyChanged(event);
129         if (file.equals(event.getFile())) {
130             // Change document
131             file.refresh(true, false, new Runnable() {
132                 public void run() {
133                     if (ImageFileTypeManager.getInstance().isImage(file)) {
134                         setValue(file);
135                     } else {
136                         setValue(null);
137                         // Close editor
138                         FileEditorManager editorManager = FileEditorManager.getInstance(project);
139                         editorManager.closeFile(file);
140                     }
141                 }
142             });
143         }
144     }
145
146     public void contentsChanged(@NotNull VirtualFileEvent event) {
147         super.contentsChanged(event);
148         if (file.equals(event.getFile())) {
149             // Change document
150             file.refresh(true, false, new Runnable() {
151                 public void run() {
152                     setValue(file);
153                 }
154             });
155         }
156     }
157 }