KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > eclipse > ui > internal > quickaccess > QuickAccessEntry


1 /*******************************************************************************
2  * Copyright (c) 2007 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  * IBM Corporation - initial API and implementation
10  ******************************************************************************/

11
12 package org.eclipse.ui.internal.quickaccess;
13
14 import org.eclipse.jface.resource.DeviceResourceException;
15 import org.eclipse.jface.resource.ImageDescriptor;
16 import org.eclipse.jface.resource.ResourceManager;
17 import org.eclipse.swt.SWT;
18 import org.eclipse.swt.graphics.Color;
19 import org.eclipse.swt.graphics.Image;
20 import org.eclipse.swt.graphics.Rectangle;
21 import org.eclipse.swt.graphics.TextLayout;
22 import org.eclipse.swt.graphics.TextStyle;
23 import org.eclipse.swt.widgets.Event;
24 import org.eclipse.swt.widgets.Table;
25 import org.eclipse.swt.widgets.TableItem;
26 import org.eclipse.ui.internal.IWorkbenchGraphicConstants;
27 import org.eclipse.ui.internal.WorkbenchImages;
28 import org.eclipse.ui.internal.WorkbenchPlugin;
29
30 class QuickAccessEntry {
31     boolean firstInCategory;
32     boolean lastInCategory;
33     QuickAccessElement element;
34     QuickAccessProvider provider;
35     int[][] elementMatchRegions;
36     int[][] providerMatchRegions;
37
38     QuickAccessEntry(QuickAccessElement element, QuickAccessProvider provider,
39             int[][] elementMatchRegions, int[][] providerMatchRegions) {
40         this.element = element;
41         this.provider = provider;
42         this.elementMatchRegions = elementMatchRegions;
43         this.providerMatchRegions = providerMatchRegions;
44     }
45
46     Image getImage(QuickAccessElement element, ResourceManager resourceManager) {
47         Image image = findOrCreateImage(element.getImageDescriptor(),
48                 resourceManager);
49         if (image == null) {
50             image = WorkbenchImages
51                     .getImage(IWorkbenchGraphicConstants.IMG_OBJ_ELEMENT);
52         }
53         return image;
54     }
55
56     private Image findOrCreateImage(ImageDescriptor imageDescriptor,
57             ResourceManager resourceManager) {
58         if (imageDescriptor == null) {
59             return null;
60         }
61         Image image = (Image) resourceManager.find(imageDescriptor);
62         if (image == null) {
63             try {
64                 image = resourceManager.createImage(imageDescriptor);
65             } catch (DeviceResourceException e) {
66                 WorkbenchPlugin.log(e);
67             }
68         }
69         return image;
70     }
71
72     /**
73      * @param event
74      * @param boldStyle
75      */

76     public void measure(Event event, TextLayout textLayout,
77             ResourceManager resourceManager, TextStyle boldStyle) {
78         Table table = ((TableItem) event.item).getParent();
79         textLayout.setFont(table.getFont());
80         switch (event.index) {
81         case 0:
82             if (firstInCategory || providerMatchRegions.length > 0) {
83                 textLayout.setText(provider.getName());
84                 for (int i = 0; i < providerMatchRegions.length; i++) {
85                     int[] matchRegion = providerMatchRegions[i];
86                     textLayout.setStyle(boldStyle, matchRegion[0],
87                             matchRegion[1]);
88                 }
89             }
90             break;
91         case 1:
92             Image image = getImage(element, resourceManager);
93             Rectangle imageRect = image.getBounds();
94             event.width += imageRect.width + 2;
95             event.height = Math.max(event.height, imageRect.height + 2);
96             textLayout.setText(element.getLabel());
97             for (int i = 0; i < elementMatchRegions.length; i++) {
98                 int[] matchRegion = elementMatchRegions[i];
99                 textLayout.setStyle(boldStyle, matchRegion[0], matchRegion[1]);
100             }
101             break;
102         }
103         Rectangle rect = textLayout.getBounds();
104         event.width += rect.width + 2;
105         event.height = Math.max(event.height, rect.height + 2);
106     }
107
108     /**
109      * @param event
110      * @param textLayout
111      * @param resourceManager
112      * @param boldStyle
113      */

114     public void paint(Event event, TextLayout textLayout,
115             ResourceManager resourceManager, TextStyle boldStyle, Color grayColor) {
116         final Table table = ((TableItem) event.item).getParent();
117         textLayout.setFont(table.getFont());
118         switch (event.index) {
119         case 0:
120             if (firstInCategory || providerMatchRegions.length > 0) {
121                 textLayout.setText(provider.getName());
122                 for (int i = 0; i < providerMatchRegions.length; i++) {
123                     int[] matchRegion = providerMatchRegions[i];
124                     textLayout.setStyle(boldStyle, matchRegion[0],
125                             matchRegion[1]);
126                 }
127                 if (providerMatchRegions.length > 0 && !firstInCategory) {
128                     event.gc.setForeground(grayColor);
129                 }
130                 Rectangle availableBounds = ((TableItem) event.item).getTextBounds(event.index);
131                 Rectangle requiredBounds = textLayout.getBounds();
132                 textLayout.draw(event.gc, availableBounds.x + 1, availableBounds.y
133                         + (availableBounds.height - requiredBounds.height) / 2);
134             }
135             break;
136         case 1:
137             Image image = getImage(element, resourceManager);
138             event.gc.drawImage(image, event.x + 1, event.y + 1);
139             textLayout.setText(element.getLabel());
140             for (int i = 0; i < elementMatchRegions.length; i++) {
141                 int[] matchRegion = elementMatchRegions[i];
142                 textLayout.setStyle(boldStyle, matchRegion[0], matchRegion[1]);
143             }
144             Rectangle availableBounds = ((TableItem) event.item).getTextBounds(event.index);
145             Rectangle requiredBounds = textLayout.getBounds();
146             textLayout.draw(event.gc, availableBounds.x + 1 + image.getBounds().width, availableBounds.y
147                     + (availableBounds.height - requiredBounds.height) / 2);
148             break;
149         }
150         if (lastInCategory) {
151             event.gc.setForeground(table.getDisplay().getSystemColor(SWT.COLOR_GRAY));
152             Rectangle bounds = ((TableItem)event.item).getBounds(event.index);
153             event.gc.drawLine(Math.max(0, bounds.x - 1), bounds.y + bounds.height - 1, bounds.x + bounds.width, bounds.y
154                     + bounds.height - 1);
155         }
156     }
157
158     /**
159      * @param event
160      */

161     public void erase(Event event) {
162         // We are only custom drawing the foreground.
163
event.detail &= ~SWT.FOREGROUND;
164     }
165 }
Popular Tags