10
|
1 /*******************************************************************************
|
|
2 * Copyright (c) 2006, 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 * Port to the D programming language:
|
|
11 * Frank Benoit <benoit@tionex.de>
|
|
12 *******************************************************************************/
|
|
13
|
|
14 module dwtx.jface.viewers.OwnerDrawLabelProvider;
|
|
15
|
|
16 import dwtx.jface.viewers.CellLabelProvider;
|
|
17 import dwtx.jface.viewers.ColumnViewer;
|
|
18 import dwtx.jface.viewers.ViewerCell;
|
|
19
|
|
20 import dwt.DWT;
|
|
21 import dwt.graphics.Color;
|
|
22 import dwt.graphics.Rectangle;
|
|
23 import dwt.widgets.Event;
|
|
24 import dwt.widgets.Listener;
|
|
25
|
|
26 import dwt.dwthelper.utils;
|
|
27
|
|
28 /**
|
|
29 * OwnerDrawLabelProvider is an abstract implementation of a label provider that
|
|
30 * handles custom draw.
|
|
31 *
|
|
32 * <p>
|
|
33 * <b>This class is intended to be subclassed by implementors.</b>
|
|
34 * </p>
|
|
35 *
|
|
36 * @since 3.3
|
|
37 *
|
|
38 */
|
|
39 public abstract class OwnerDrawLabelProvider : CellLabelProvider {
|
|
40
|
|
41 /**
|
|
42 * Set up the owner draw callbacks for the viewer.
|
|
43 *
|
|
44 * @param viewer
|
|
45 * the viewer the owner draw is set up
|
|
46 */
|
|
47 public static void setUpOwnerDraw(ColumnViewer viewer) {
|
39
|
48 viewer.getControl().addListener(DWT.MeasureItem, new class(viewer) Listener {
|
10
|
49 ColumnViewer viewer_;
|
39
|
50 this(ColumnViewer a){
|
|
51 viewer_=a;
|
10
|
52 }
|
|
53 /*
|
|
54 * (non-Javadoc)
|
|
55 *
|
|
56 * @see dwt.widgets.Listener#handleEvent(dwt.widgets.Event)
|
|
57 */
|
|
58 public void handleEvent(Event event) {
|
|
59 CellLabelProvider provider = viewer_
|
|
60 .getViewerColumn(event.index).getLabelProvider();
|
|
61 Object element = event.item.getData();
|
|
62
|
|
63 if ( auto p = cast(OwnerDrawLabelProvider) provider )
|
|
64 p.measure(event, element);
|
|
65 }
|
|
66 });
|
|
67
|
39
|
68 viewer.getControl().addListener(DWT.PaintItem, new class(viewer) Listener {
|
10
|
69 ColumnViewer viewer_;
|
39
|
70 this(ColumnViewer a){
|
|
71 viewer_=a;
|
10
|
72 }
|
|
73 /*
|
|
74 * (non-Javadoc)
|
|
75 *
|
|
76 * @see dwt.widgets.Listener#handleEvent(dwt.widgets.Event)
|
|
77 */
|
|
78 public void handleEvent(Event event) {
|
|
79 CellLabelProvider provider = viewer_
|
|
80 .getViewerColumn(event.index).getLabelProvider();
|
|
81 Object element = event.item.getData();
|
|
82
|
|
83 if ( auto p = cast(OwnerDrawLabelProvider) provider )
|
|
84 p.paint(event, element);
|
|
85 }
|
|
86 });
|
|
87
|
39
|
88 viewer.getControl().addListener(DWT.EraseItem, new class(viewer) Listener {
|
10
|
89 ColumnViewer viewer_;
|
39
|
90 this(ColumnViewer a){
|
|
91 viewer_=a;
|
10
|
92 }
|
|
93 /*
|
|
94 * (non-Javadoc)
|
|
95 *
|
|
96 * @see dwt.widgets.Listener#handleEvent(dwt.widgets.Event)
|
|
97 */
|
|
98 public void handleEvent(Event event) {
|
|
99
|
|
100 CellLabelProvider provider = getLabelProvider(viewer_, event);
|
|
101 Object element = getElement(event);
|
|
102
|
|
103 if ( auto p = cast(OwnerDrawLabelProvider) provider )
|
|
104 p.erase(event, element);
|
|
105
|
|
106 }
|
|
107
|
|
108 /**
|
|
109 * Return the item for the event
|
|
110 *
|
|
111 * @param event
|
|
112 * @return Object
|
|
113 */
|
|
114 private Object getElement(Event event) {
|
|
115 return event.item.getData();
|
|
116 }
|
|
117
|
|
118 /**
|
|
119 * Return the label provider for the column.
|
|
120 *
|
|
121 * @param viewer
|
|
122 * @param event
|
|
123 * @return CellLabelProvider
|
|
124 */
|
|
125 private CellLabelProvider getLabelProvider(
|
39
|
126 ColumnViewer cv, Event event) {
|
|
127 return cv.getViewerColumn(event.index).getLabelProvider();
|
10
|
128 }
|
|
129 });
|
|
130 }
|
|
131
|
|
132 /**
|
|
133 * Handle the erase event. The default implementation colors the background
|
|
134 * of selected areas with {@link DWT#COLOR_LIST_SELECTION} and foregrounds
|
|
135 * with {@link DWT#COLOR_LIST_SELECTION_TEXT}
|
|
136 *
|
|
137 * @param event
|
|
138 * the erase event
|
|
139 * @param element
|
|
140 * the model object
|
|
141 * @see DWT#EraseItem
|
|
142 * @see DWT#COLOR_LIST_SELECTION
|
|
143 * @see DWT#COLOR_LIST_SELECTION_TEXT
|
|
144 */
|
|
145 protected void erase(Event event, Object element) {
|
|
146
|
|
147 Rectangle bounds = event.getBounds();
|
|
148 if ((event.detail & DWT.SELECTED) !is 0) {
|
|
149
|
|
150 Color oldForeground = event.gc.getForeground();
|
|
151 Color oldBackground = event.gc.getBackground();
|
|
152
|
|
153 event.gc.setBackground(event.item.getDisplay().getSystemColor(
|
|
154 DWT.COLOR_LIST_SELECTION));
|
|
155 event.gc.setForeground(event.item.getDisplay().getSystemColor(
|
|
156 DWT.COLOR_LIST_SELECTION_TEXT));
|
|
157 event.gc.fillRectangle(bounds);
|
|
158 /* restore the old GC colors */
|
|
159 event.gc.setForeground(oldForeground);
|
|
160 event.gc.setBackground(oldBackground);
|
|
161 /* ensure that default selection is not drawn */
|
|
162 event.detail &= ~DWT.SELECTED;
|
|
163
|
|
164 }
|
|
165
|
|
166 }
|
|
167
|
|
168 /**
|
|
169 * Handle the paint event.
|
|
170 *
|
|
171 * @param event
|
|
172 * the paint event
|
|
173 * @param element
|
|
174 * the model element
|
|
175 * @see DWT#PaintItem
|
|
176 */
|
|
177 protected abstract void paint(Event event, Object element);
|
|
178
|
|
179 /**
|
|
180 * Handle the measure event.
|
|
181 *
|
|
182 * @param event
|
|
183 * the measure event
|
|
184 * @param element
|
|
185 * the model element
|
|
186 * @see DWT#MeasureItem
|
|
187 */
|
|
188 protected abstract void measure(Event event, Object element);
|
|
189
|
|
190 /**
|
|
191 * Create a new instance of the receiver based on a column viewer.
|
|
192 *
|
|
193 */
|
|
194 public this() {
|
|
195
|
|
196 }
|
|
197
|
|
198 /*
|
|
199 * (non-Javadoc)
|
|
200 *
|
|
201 * @see dwtx.jface.viewers.ViewerLabelProvider#update(dwtx.jface.viewers.ViewerCell)
|
|
202 */
|
|
203 public void update(ViewerCell cell) {
|
|
204 // Force a redraw
|
|
205 Rectangle cellBounds = cell.getBounds();
|
|
206 cell.getControl().redraw(cellBounds.x, cellBounds.y, cellBounds.width,
|
|
207 cellBounds.height, true);
|
|
208
|
|
209 }
|
|
210
|
|
211 }
|