/******************************************************************************* * Copyright (c) 2012 Martin Reiterer. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * Contributors: * Martin Reiterer - initial API and implementation * Christian Behon - refactor from e3 to e4 ******************************************************************************/ package org.eclipselabs.e4.tapiji.translator.ui.treeviewer.provider; import static org.eclipselabs.e4.tapiji.translator.constant.TranslatorConstant.COLOR_BLACK; import static org.eclipselabs.e4.tapiji.translator.constant.TranslatorConstant.COLOR_INFO; import static org.eclipselabs.e4.tapiji.translator.constant.TranslatorConstant.FONT_ITALIC; import java.util.ArrayList; import java.util.List; import javax.annotation.PreDestroy; import org.eclipse.jface.viewers.StyledCellLabelProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.graphics.Font; import org.eclipselabs.e4.tapiji.translator.model.Term; import org.eclipselabs.e4.tapiji.translator.model.Translation; import org.eclipselabs.e4.tapiji.translator.model.filter.FilterInfo; import org.eclipselabs.e4.tapiji.translator.model.filter.FilterRegion; public final class TreeViewerLabelProvider extends StyledCellLabelProvider { private static final String TAG = TreeViewerLabelProvider.class.getSimpleName(); private static final List<StyleRange> STYLE_RANGES = new ArrayList<StyleRange>(); private final TreeViewer treeViewer; private final List<String> translations; private boolean isSearchEnabled; private final int referenceColumn; public TreeViewerLabelProvider(final TreeViewer treeViewer, final List<String> displayedTranslations, final int referenceColumn) { super(); this.treeViewer = treeViewer; this.translations = displayedTranslations; this.referenceColumn = referenceColumn; } @Override public void update(final ViewerCell cell) { final Object element = cell.getElement(); final int columnIndex = cell.getColumnIndex(); cell.setText(this.getColumnText(element, columnIndex)); /*if (isCrossRefRegion(cell.getText())) { cell.setFont(FONT_BOLD); cell.setBackground(COLOR_CROSSREFERENCE_BACKGROUND); cell.setForeground(COLOR_CROSSREFERENCE_FOREGROUND); } else { cell.setFont(getColumnFont(element, columnIndex)); cell.setBackground(COLOR_WHITE); cell.setForeground(COLOR_BLACK); }*/ if (isSearchEnabled) { searchStyle(cell, (Term) element, columnIndex); } else { cell.setStyleRanges(null); } super.update(cell); } private void searchStyle(final ViewerCell cell, final Term term, final int columnIndex) { if (isMatchingToPattern(term, columnIndex)) { final List<FilterRegion> regions = ((FilterInfo) term.getInfo()).getFoundInTranslationRanges(getColumnLocale(columnIndex)); StyleRange style; for (final FilterRegion reg : regions) { style = new StyleRange(reg.getOffset(), reg.getLength(), COLOR_BLACK, COLOR_INFO, SWT.BOLD); STYLE_RANGES.add(style); } cell.setStyleRanges(STYLE_RANGES.toArray(new StyleRange[STYLE_RANGES.size()])); } else { cell.setForeground(COLOR_BLACK); } } private String getColumnLocale(final int columnIndex) { int index = 0; if (columnIndex < referenceColumn) { index = columnIndex + 1; } else { index = columnIndex; } return translations.get(index); } public void isSearchEnabled(final boolean isSearchEnabled) { this.isSearchEnabled = isSearchEnabled; } private boolean isMatchingToPattern(final Term element, final int columnIndex) { boolean matching = false; final Term term = element; if (term.getInfo() != null) { matching = ((FilterInfo) term.getInfo()).hasFoundInTranslation(translations.get(columnIndex)); } return matching; } protected Font getColumnFont(final Object element, final int columnIndex) { if (columnIndex == 0) { return FONT_ITALIC; } return null; } protected boolean isCrossRefRegion(final String cellText) { return false; } public String getColumnText(final Object element, final int columnIndex) { if (null != element) { final Term term = (Term) element; final Translation transl = term.getTranslation(translations.get(columnIndex)); return transl != null ? transl.value : ""; } else { return ""; } } @Override @PreDestroy public void dispose() { STYLE_RANGES.clear(); } public static TreeViewerLabelProvider newInstance(final TreeViewer treeViewer, final List<String> displayedTranslations, final int referenceColumn) { return new TreeViewerLabelProvider(treeViewer, displayedTranslations, referenceColumn); } }