/******************************************************************************* * 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.ui.controls.text.styled; 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.swt.custom.StyledText; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Point; /** * @author Yuri Strot */ public abstract class AbstractStyledTextSource extends BaseTextSource implements SelectionListener { private StyledTextSelector focusKeeper; private final StyledText text; private boolean inited; private boolean disposed; private final ListenerList list; private final StyledTextBlock[] blocks; protected Match selected; public AbstractStyledTextSource(final StyledText text) { this.text = text; blocks = new StyledTextBlock[] {createTextBlock()}; list = new ListenerList(); } @Override public void addTextSourceListener(final ITextSourceListener listener) { list.add(listener); } @Override public final void dispose() { if (text != null && !text.isDisposed() && !disposed) { doDispose(); } disposed = true; } @Override public ITextBlock[] getBlocks() { return blocks; } @Override public SourceSelection getSelection() { final Point point = text.getSelection(); final SourceSelection selection = new SourceSelection(blocks[0], point.x, point.y - point.x); return selection; } @Override public void init() { if (inited) { return; } inited = true; focusKeeper = new StyledTextSelector(text); text.addSelectionListener(this); } @Override public boolean isDisposed() { return disposed; } @Override public void removeTextSourceListener(final ITextSourceListener listener) { list.remove(listener); } @Override public void select(final Match match) { this.selected = match; focusKeeper.setMatch(match); } @Override public void widgetDefaultSelected(final SelectionEvent e) { fireSelectionChanged(); } @Override public void widgetSelected(final SelectionEvent e) { fireSelectionChanged(); } protected StyledTextBlock createTextBlock() { return new StyledTextBlock(text); } protected void doDispose() { focusKeeper.dispose(); text.removeSelectionListener(this); } protected StyledText getText() { return text; } private void fireSelectionChanged() { final SourceSelection selection = getSelection(); final Object[] objects = list.getListeners(); for (final Object object : objects) { final ITextSourceListener listener = (ITextSourceListener) object; listener.selectionChanged(selection); } } }