KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > terracotta > dso > editors > tree > ProjectNode


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
3  */

4 package org.terracotta.dso.editors.tree;
5
6 import org.eclipse.core.resources.IContainer;
7 import org.eclipse.core.resources.IResource;
8 import org.eclipse.core.runtime.IPath;
9 import org.eclipse.core.runtime.Path;
10 import org.eclipse.debug.ui.DebugUITools;
11 import org.eclipse.debug.ui.IDebugUIConstants;
12 import org.eclipse.jdt.core.IJavaElement;
13 import org.eclipse.jdt.core.JavaCore;
14 import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
15 import org.eclipse.jdt.ui.ISharedImages;
16 import org.eclipse.jdt.ui.JavaElementLabelProvider;
17 import org.eclipse.jdt.ui.JavaUI;
18 import org.eclipse.swt.graphics.ImageData;
19 import org.eclipse.swt.graphics.PaletteData;
20 import org.eclipse.swt.graphics.RGB;
21
22 import com.tc.admin.common.XTreeNode;
23
24 import java.awt.Image JavaDoc;
25 import java.awt.image.BufferedImage JavaDoc;
26 import java.awt.image.ColorModel JavaDoc;
27 import java.awt.image.DirectColorModel JavaDoc;
28 import java.awt.image.IndexColorModel JavaDoc;
29 import java.awt.image.WritableRaster JavaDoc;
30 import java.io.File JavaDoc;
31 import java.util.HashMap JavaDoc;
32
33 import javax.swing.ImageIcon JavaDoc;
34
35 /**
36  * Base type for tree nodes that represent Java project artifacts.
37  *
38  * Used by the navigators that support various editor chooser:
39  *
40  * @see org.terracotta.dso.editors.chooser.ClassNavigator
41  * @see org.terracotta.dso.editors.chooser.FieldNavigator
42  * @see org.terracotta.dso.editors.chooser.MethodNavigator
43  *
44  * @see CompilationUnitNode
45  * @see FieldNode
46  * @see JavaProjectModel
47  * @see JavaProjectRoot
48  * @see MethodNode
49  * @see PackageFragmentNode
50  * @see TypeNode
51  */

52
53 public abstract class ProjectNode extends XTreeNode {
54   private static HashMap JavaDoc<String JavaDoc, Image JavaDoc> m_imageMap;
55   private static JavaElementLabelProvider m_javaLabelProvider;
56
57   static {
58     m_imageMap = new HashMap JavaDoc<String JavaDoc, Image JavaDoc>();
59     m_javaLabelProvider = new JavaElementLabelProvider();
60   }
61   
62   public ProjectNode() {
63     super();
64   }
65   
66   public ProjectNode(Object JavaDoc obj) {
67     super(obj);
68     setIcon(new ImageIcon JavaDoc(getAWTImage(obj)));
69   }
70
71   public Image JavaDoc getAWTImage(Object JavaDoc adaptable) {
72     org.eclipse.swt.graphics.Image swtImage = getImage(adaptable);
73     Image JavaDoc awtImage = null;
74     
75     if(swtImage != null) {
76       String JavaDoc swtHandle = swtImage.toString();
77       
78       if((awtImage = m_imageMap.get(swtHandle)) == null) {
79         m_imageMap.put(swtHandle, awtImage = swt2Swing(swtImage));
80       }
81     }
82     
83     return awtImage;
84   }
85   
86   private org.eclipse.swt.graphics.Image getImage(Object JavaDoc adaptable) {
87     if(adaptable instanceof IRuntimeClasspathEntry) {
88       return getImage((IRuntimeClasspathEntry)adaptable);
89     }
90     else {
91       return m_javaLabelProvider.getImage(adaptable);
92     }
93   }
94
95   private org.eclipse.swt.graphics.Image getImage(IRuntimeClasspathEntry entry) {
96     IResource resource = entry.getResource();
97     
98     switch(entry.getType()) {
99       case IRuntimeClasspathEntry.PROJECT:
100         //TODO what if project not loaded?
101
IJavaElement proj = JavaCore.create(resource);
102         return m_javaLabelProvider.getImage(proj);
103       case IRuntimeClasspathEntry.ARCHIVE:
104         if(resource instanceof IContainer) {
105           return m_javaLabelProvider.getImage(resource);
106         }
107         boolean external = resource == null;
108         boolean source = (entry.getSourceAttachmentPath() != null && !Path.EMPTY.equals(entry.getSourceAttachmentPath()));
109         String JavaDoc key = null;
110         if(external) {
111           IPath path = entry.getPath();
112           if(path != null) {
113             //TODO: check for invalid paths and change image
114
File JavaDoc file = path.toFile();
115             if(file.exists() && file.isDirectory()) {
116               key = ISharedImages.IMG_OBJS_PACKFRAG_ROOT;
117             } else if(source) {
118               key = ISharedImages.IMG_OBJS_EXTERNAL_ARCHIVE_WITH_SOURCE;
119             } else {
120               key = ISharedImages.IMG_OBJS_EXTERNAL_ARCHIVE;
121             }
122           }
123         } else {
124           if (source) {
125             key = ISharedImages.IMG_OBJS_JAR_WITH_SOURCE;
126           } else {
127             key = ISharedImages.IMG_OBJS_JAR;
128           }
129         }
130         return JavaUI.getSharedImages().getImage(key);
131       case IRuntimeClasspathEntry.VARIABLE:
132         return DebugUITools.getImage(IDebugUIConstants.IMG_OBJS_ENV_VAR);
133       case IRuntimeClasspathEntry.CONTAINER:
134         return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_LIBRARY);
135       case IRuntimeClasspathEntry.OTHER:
136         IRuntimeClasspathEntry delegate = entry;
137         
138         org.eclipse.swt.graphics.Image image = m_javaLabelProvider.getImage(delegate);
139         if(image != null) {
140           return image;
141         }
142         if(resource == null) {
143           return JavaUI.getSharedImages().getImage(ISharedImages.IMG_OBJS_LIBRARY);
144         }
145         return m_javaLabelProvider.getImage(resource);
146     }
147     
148     return null;
149   }
150   
151   private Image JavaDoc swt2Swing(org.eclipse.swt.graphics.Image swtImage) {
152     return convertToAWT(swtImage.getImageData());
153   }
154   
155   /**
156    * I found this on the web. It didn't work but I fixed it, at least for
157    * direct color model.
158    */

159   static BufferedImage JavaDoc convertToAWT(ImageData data) {
160     ColorModel JavaDoc colorModel = null;
161     PaletteData palette = data.palette;
162     
163     if(palette.isDirect) {
164       ImageData maskData = data.getTransparencyMask();
165       int maskPix;
166       
167       colorModel = new DirectColorModel JavaDoc(32, 0x000000ff,
168                                             0x0000ff00,
169                                             0x00ff0000,
170                                             0xff000000);
171       
172       BufferedImage JavaDoc bufferedImage =
173         new BufferedImage JavaDoc(colorModel,
174                           colorModel.createCompatibleWritableRaster(data.width, data.height),
175                           false, null);
176       
177       WritableRaster JavaDoc raster = bufferedImage.getRaster();
178       int[] pixelArray = new int[4];
179
180       for(int y = 0; y < data.height; y++) {
181         for(int x = 0; x < data.width; x++) {
182           int pixel = data.getPixel(x, y);
183           RGB rgb = palette.getRGB(pixel);
184           
185           pixelArray[0] = rgb.red;
186           pixelArray[1] = rgb.green;
187           pixelArray[2] = rgb.blue;
188           
189           maskPix = maskData.getPixel(x,y);
190           pixelArray[3] = (maskPix == 1) ? 0xff : 0;
191           
192           raster.setPixels(x, y, 1, 1, pixelArray);
193         }
194       }
195       
196       return bufferedImage;
197     }
198     else {
199       RGB[] rgbs = palette.getRGBs();
200       byte[] red = new byte[rgbs.length];
201       byte[] green = new byte[rgbs.length];
202       byte[] blue = new byte[rgbs.length];
203       
204       for(int i = 0; i < rgbs.length; i++) {
205         RGB rgb = rgbs[i];
206         
207         red[i] = (byte)rgb.red;
208         green[i] = (byte)rgb.green;
209         blue[i] = (byte)rgb.blue;
210       }
211
212       colorModel = (data.transparentPixel != -1) ?
213           new IndexColorModel JavaDoc(data.depth, rgbs.length, red, green, blue, data.transparentPixel) :
214           new IndexColorModel JavaDoc(data.depth, rgbs.length, red, green, blue);
215
216       BufferedImage JavaDoc bufferedImage =
217         new BufferedImage JavaDoc(colorModel,
218                           colorModel.createCompatibleWritableRaster(data.width, data.height),
219                           false, null);
220       
221       WritableRaster JavaDoc raster = bufferedImage.getRaster();
222       int[] pixelArray = new int[1];
223       
224       for(int y = 0; y < data.height; y++) {
225         for(int x = 0; x < data.width; x++) {
226           int pixel = data.getPixel(x, y);
227           
228           pixelArray[0] = pixel;
229           
230           raster.setPixel(x, y, pixelArray);
231         }
232       }
233       
234       return bufferedImage;
235     }
236   }
237   
238   protected void setChildAt(ProjectNode child, int index) {
239     children.setElementAt(child, index);
240     child.setParent(this);
241   }
242 }
243
Popular Tags