1 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 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 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 161 public void erase(Event event) { 162 event.detail &= ~SWT.FOREGROUND; 164 } 165 } | Popular Tags |