/******************************************************************************* * Copyright (c) 2012 xored software, Inc. 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: * xored software, Inc. - initial API and implementation (Yuri Strot) ******************************************************************************/ package com.xored.glance.internal.ui.viewers; import com.xored.glance.ui.controls.text.styled.TextSelector; import com.xored.glance.ui.sources.BaseTextSource; import com.xored.glance.ui.sources.ITextBlock; import com.xored.glance.ui.sources.ITextSourceListener; import com.xored.glance.ui.sources.Match; import com.xored.glance.ui.sources.SourceSelection; import org.eclipse.core.runtime.ListenerList; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.text.TextViewer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.graphics.Point; /** * @author Yuri Strot */ public class TextViewerControl extends BaseTextSource implements ISelectionChangedListener { private TextSelector selector; private final ListenerList listeners; private boolean disposed; private final ColoredTextViewerBlock[] blocks; private final TextViewer viewer; public TextViewerControl(final TextViewer viewer) { this.viewer = viewer; listeners = new ListenerList(); blocks = new ColoredTextViewerBlock[] {new ColoredTextViewerBlock(viewer)}; } @Override public void addTextSourceListener(final ITextSourceListener listener) { listeners.add(listener); } @Override public void dispose() { if (!disposed) { selector.dispose(); viewer.removeSelectionChangedListener(this); getBlock().dispose(); disposed = true; } } public ColoredTextViewerBlock getBlock() { return blocks[0]; } @Override public ITextBlock[] getBlocks() { return blocks; } @Override public SourceSelection getSelection() { final Point selection = viewer.getSelectedRange(); return new SourceSelection(getBlock(), selection.x, selection.y); } @Override public void init() { selector = new ViewerSelector(viewer); viewer.addSelectionChangedListener(this); } @Override public boolean isDisposed() { return disposed; } @Override public void removeTextSourceListener(final ITextSourceListener listener) { listeners.remove(listener); } @Override public void select(final Match match) { getBlock().setSelected(match); selector.setMatch(match); } @Override public void selectionChanged(final SelectionChangedEvent event) { final ISelection selection = event.getSelection(); if (selection instanceof TextSelection) { final TextSelection tSelection = (TextSelection) selection; final SourceSelection sSelection = new SourceSelection( getBlock(), tSelection.getOffset(), tSelection.getLength()); final Object[] objects = listeners.getListeners(); for (final Object object : objects) { final ITextSourceListener listener = (ITextSourceListener) object; listener.selectionChanged(sSelection); } } } @Override public void show(final Match[] matches) { getBlock().setMatches(matches); } }