1
/*******************************************************************************
2
* Copyright (c) 2009 STMicroelectronics.
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
9
* Marzia Maugeri <marzia.maugeri@st.com> - initial API and implementation
10
*******************************************************************************/
12
package org.eclipse.linuxtools.dataviewers.findreplace;
14
import java.util.LinkedList;
16
import org.eclipse.core.runtime.Assert;
17
import org.eclipse.jface.viewers.TreePath;
18
import org.eclipse.jface.viewers.ViewerRow;
19
import org.eclipse.swt.graphics.Color;
20
import org.eclipse.swt.graphics.Font;
21
import org.eclipse.swt.graphics.Image;
22
import org.eclipse.swt.graphics.Rectangle;
23
import org.eclipse.swt.widgets.Tree;
24
import org.eclipse.swt.widgets.TreeItem;
27
* This is a copy of TreeViewerRow is the Tree implementation of ViewerRow.
28
* It's useful to use some methods from protected to public that in the original
29
* TreeViewerRow can't be used
32
public class STTreeViewerRow extends STViewerRow<TreeItem> {
35
* Create a new instance of the receiver.
38
public STTreeViewerRow(TreeItem item) {
43
* @see org.eclipse.jface.viewers.ViewerRow#getBounds()
46
public Rectangle getBounds() {
47
return getItem().getBounds();
51
* @see org.eclipse.jface.viewers.ViewerRow#getBounds(int)
54
public Rectangle getBounds(int columnIndex) {
55
return getItem().getBounds(columnIndex);
59
* @see org.eclipse.jface.viewers.ViewerRow#getColumnCount()
62
public int getColumnCount() {
63
return getItem().getParent().getColumnCount();
67
* @see org.eclipse.jface.viewers.ViewerRow#getBackground(int)
70
public Color getBackground(int columnIndex) {
71
return getItem().getBackground(columnIndex);
75
* @see org.eclipse.jface.viewers.ViewerRow#getFont(int)
78
public Font getFont(int columnIndex) {
79
return getItem().getFont(columnIndex);
83
* @see org.eclipse.jface.viewers.ViewerRow#getForeground(int)
86
public Color getForeground(int columnIndex) {
87
return getItem().getForeground(columnIndex);
91
* @see org.eclipse.jface.viewers.ViewerRow#getImage(int)
94
public Image getImage(int columnIndex) {
95
return getItem().getImage(columnIndex);
99
* @see org.eclipse.jface.viewers.ViewerRow#getText(int)
102
public String getText(int columnIndex) {
103
return getItem().getText(columnIndex);
107
* @see org.eclipse.jface.viewers.ViewerRow#setBackground(int, org.eclipse.swt.graphics.Color)
110
public void setBackground(int columnIndex, Color color) {
111
getItem().setBackground(columnIndex, color);
115
* @see org.eclipse.jface.viewers.ViewerRow#setFont(int, org.eclipse.swt.graphics.Font)
118
public void setFont(int columnIndex, Font font) {
119
getItem().setFont(columnIndex, font);
123
* @see org.eclipse.jface.viewers.ViewerRow#setForeground(int, org.eclipse.swt.graphics.Color)
126
public void setForeground(int columnIndex, Color color) {
127
getItem().setForeground(columnIndex, color);
131
* @see org.eclipse.jface.viewers.ViewerRow#setImage(int, org.eclipse.swt.graphics.Image)
134
public void setImage(int columnIndex, Image image) {
135
Image oldImage = getItem().getImage(columnIndex);
136
if (image != oldImage) {
137
getItem().setImage(columnIndex, image);
142
* @see org.eclipse.jface.viewers.ViewerRow#setText(int, java.lang.String)
145
public void setText(int columnIndex, String text) {
146
getItem().setText(columnIndex, text == null ? "" : text); //$NON-NLS-1$
150
* @see org.eclipse.jface.viewers.ViewerRow#getControl()
153
public Tree getControl() {
154
return getItem().getParent();
159
* @see org.eclipse.linuxtools.dataviewers.findreplace.STViewerRow#getRowBelow(boolean)
162
protected ViewerRow getRowBelow(boolean sameLevel) {
163
Tree tree = getItem().getParent();
165
// This means we have top-level item
166
if( getItem().getParentItem() == null ) {
167
if( sameLevel || ! getItem().getExpanded() ) {
168
int index = tree.indexOf(getItem()) + 1;
169
if( index < tree.getItemCount() ) {
170
return new STTreeViewerRow(tree.getItem(index));
172
} else if( getItem().getExpanded() && getItem().getItemCount() > 0 ) {
173
return new STTreeViewerRow(getItem().getItem(0));
176
if( sameLevel || ! getItem().getExpanded() ) {
177
TreeItem parentItem = getItem().getParentItem();
179
int nextIndex = parentItem.indexOf(getItem()) + 1;
180
int totalIndex = parentItem.getItemCount();
183
// This would mean that it was the last item
184
if( nextIndex == totalIndex ) {
185
itemAfter = findNextItem( parentItem );
187
itemAfter = parentItem.getItem(nextIndex);
190
if( itemAfter != null ) {
191
return new STTreeViewerRow(itemAfter);
193
} else if( getItem().getExpanded() && getItem().getItemCount() > 0 ) {
194
return new STTreeViewerRow(getItem().getItem(0));
202
* @see org.eclipse.linuxtools.dataviewers.findreplace.STViewerRow#getRowAbove(boolean)
205
protected ViewerRow getRowAbove(boolean sameLevel) {
206
Tree tree = getItem().getParent();
208
// This means we have top-level item
209
if( getItem().getParentItem() == null ) {
210
int index = tree.indexOf(getItem()) - 1;
211
TreeItem nextTopItem = null;
213
nextTopItem = tree.getItem(index);
215
if (nextTopItem != null) {
217
return new STTreeViewerRow(nextTopItem);
219
return new STTreeViewerRow(findLastVisibleItem(nextTopItem));
222
TreeItem parentItem = getItem().getParentItem();
223
int previousIndex = parentItem.indexOf(getItem()) - 1;
226
if( previousIndex >= 0 ) {
228
itemBefore = parentItem.getItem(previousIndex);
230
itemBefore = findLastVisibleItem(parentItem.getItem(previousIndex));
233
itemBefore = parentItem;
235
if( itemBefore != null ) {
236
return new STTreeViewerRow(itemBefore);
242
private TreeItem findLastVisibleItem(TreeItem parentItem) {
243
TreeItem rv = parentItem;
244
while( rv.getExpanded() && rv.getItemCount() > 0 ) {
245
rv = rv.getItem(rv.getItemCount()-1);
250
private TreeItem findNextItem(TreeItem item) {
252
Tree tree = item.getParent();
253
TreeItem parentItem = item.getParentItem();
258
if( parentItem == null ) {
259
nextIndex = tree.indexOf(item) + 1;
260
totalItems = tree.getItemCount();
262
nextIndex = parentItem.indexOf(item) + 1;
263
totalItems = parentItem.getItemCount();
266
// This is once more the last item in the tree
268
if( nextIndex == totalItems ) {
269
if( item.getParentItem() != null ) {
270
rv = findNextItem(item.getParentItem());
273
if( parentItem == null ) {
274
rv = tree.getItem(nextIndex);
276
rv = parentItem.getItem(nextIndex);
285
* @see org.eclipse.jface.viewers.ViewerRow#getTreePath()
288
public TreePath getTreePath() {
289
TreeItem tItem = getItem();
290
LinkedList<Object> segments = new LinkedList<Object>();
291
while (tItem != null) {
292
Object segment = tItem.getData();
293
Assert.isNotNull(segment);
294
segments.addFirst(segment);
295
tItem = tItem.getParentItem();
297
return new TreePath(segments.toArray());
302
* @see org.eclipse.jface.viewers.ViewerRow#clone()
305
public STTreeViewerRow clone() {
306
return new STTreeViewerRow(getItem());