94026bc8de640ff53c392214831171543697d0a1
[idea/community.git] / images / src / org / intellij / images / index / ImageInfoIndex.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
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.index;
17
18 import com.intellij.openapi.project.Project;
19 import com.intellij.openapi.vfs.LocalFileSystem;
20 import com.intellij.openapi.vfs.VirtualFile;
21 import com.intellij.openapi.vfs.ex.temp.TempFileSystem;
22 import com.intellij.psi.search.GlobalSearchScopes;
23 import com.intellij.util.indexing.*;
24 import com.intellij.util.io.DataExternalizer;
25 import org.intellij.images.fileTypes.ImageFileTypeManager;
26 import org.intellij.images.util.ImageInfoReader;
27 import org.jetbrains.annotations.NotNull;
28
29 import java.io.DataInput;
30 import java.io.DataOutput;
31 import java.io.IOException;
32
33 /**
34  * @author spleaner
35  */
36 public class ImageInfoIndex extends SingleEntryFileBasedIndexExtension<ImageInfoIndex.ImageInfo> {
37   public static final ID<Integer, ImageInfo> INDEX_ID = ID.create("ImageFileInfoIndex");
38
39   private final FileBasedIndex.InputFilter myInputFilter = new FileBasedIndex.InputFilter() {
40     public boolean acceptInput(final VirtualFile file) {
41       return (file.getFileSystem() == LocalFileSystem.getInstance() || file.getFileSystem() instanceof TempFileSystem) &&
42              file.getFileType() == ImageFileTypeManager.getInstance().getImageFileType();
43     }
44   };
45
46   private final DataExternalizer<ImageInfo> myValueExternalizer = new DataExternalizer<ImageInfo>() {
47     public void save(final DataOutput out, final ImageInfo info) throws IOException {
48       out.writeInt(info.width);
49       out.writeInt(info.height);
50       out.writeInt(info.bpp);
51     }
52
53     public ImageInfo read(final DataInput in) throws IOException {
54       return new ImageInfo(in.readInt(), in.readInt(), in.readInt());
55     }
56   };
57
58   private final SingleEntryIndexer<ImageInfo> myDataIndexer = new SingleEntryIndexer<ImageInfo>(false) {
59     protected ImageInfo computeValue(@NotNull FileContent inputData) {
60       final ImageInfoReader.Info info = ImageInfoReader.getInfo(inputData.getContent());
61       return info != null? new ImageInfo(info.width, info.height, info.bpp) : null;
62     }
63   };
64
65   public ID<Integer, ImageInfo> getName() {
66     return INDEX_ID;
67   }
68
69   public SingleEntryIndexer<ImageInfo> getIndexer() {
70     return myDataIndexer;
71   }
72
73   public static void processValues(VirtualFile virtualFile, FileBasedIndex.ValueProcessor<ImageInfo> processor, Project project) {
74     FileBasedIndex.getInstance().processValues(INDEX_ID, Math.abs(FileBasedIndex.getFileId(virtualFile)), virtualFile, processor, GlobalSearchScopes
75         .fileScope(project, virtualFile));
76   }
77
78   public DataExternalizer<ImageInfo> getValueExternalizer() {
79     return myValueExternalizer;
80   }
81
82   public FileBasedIndex.InputFilter getInputFilter() {
83     return myInputFilter;
84   }
85
86   public int getVersion() {
87     return 3;
88   }
89
90   public static class ImageInfo {
91     public int width;
92     public int height;
93     public int bpp;
94
95     public ImageInfo(int width, int height, int bpp) {
96       this.width = width;
97       this.height = height;
98       this.bpp = bpp;
99     }
100
101     @Override
102     public boolean equals(Object o) {
103       if (this == o) return true;
104       if (o == null || getClass() != o.getClass()) return false;
105
106       ImageInfo imageInfo = (ImageInfo)o;
107
108       if (bpp != imageInfo.bpp) return false;
109       if (height != imageInfo.height) return false;
110       if (width != imageInfo.width) return false;
111
112       return true;
113     }
114
115     @Override
116     public int hashCode() {
117       int result = width;
118       result = 31 * result + height;
119       result = 31 * result + bpp;
120       return result;
121     }
122   }
123 }