package org.csstudio.sds.ui.internal.editor.newproperties; import java.util.ArrayList; import java.util.List; import org.csstudio.sds.internal.model.FontProperty; import org.csstudio.sds.model.AbstractWidgetModel; import org.csstudio.sds.ui.SdsUiPlugin; import org.csstudio.sds.ui.internal.editor.newproperties.colorservice.NamedFont; import org.csstudio.sds.util.ColorAndFontUtil; import org.eclipse.jface.fieldassist.IContentProposal; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.FontDialog; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.Hyperlink; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; /** * Section for {@link FontProperty}. * * @author Sven Wende * */ public class FontSection extends AbstractTextSection<FontProperty, String> implements ISelectionChangedListener { private String latestFont; static ImageRegistry imageRegistry = new ImageRegistry(); private FontDialog fontDialog; public FontSection(String propertyId) { super(propertyId); } /** *{@inheritDoc} */ @Override protected String getConvertedValue(String text) { return text; } /** *{@inheritDoc} */ @Override protected void doCreateControls(Composite parent, TabbedPropertySheetPage tabbedPropertySheetPage) { super.doCreateControls(parent, tabbedPropertySheetPage); fontDialog = new FontDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell()); FormData fd; // .. button to open the color dialog Hyperlink link = getWidgetFactory().createHyperlink(parent, "Choose ...", SWT.NONE); link.setUnderlined(false); fd = new FormData(); fd.right = new FormAttachment(50,0); link.setLayoutData(fd); link.addHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { FontData fontdata = fontDialog.open(); if (fontdata != null) { boolean italic = ((fontdata.getStyle() & SWT.ITALIC) == SWT.ITALIC); boolean bold = ((fontdata.getStyle() & SWT.BOLD) == SWT.BOLD); String f = ColorAndFontUtil.toFontString(fontdata.getName(), fontdata.getHeight(), bold, italic); applyPropertyChange(f); } } }); // .. change position of the text control fd = new FormData(); fd.left = new FormAttachment(0,0); fd.right = new FormAttachment(link, -5); getTextControl().setLayoutData(fd); } /** *{@inheritDoc} */ @Override protected void doRefreshControls(FontProperty widgetProperty) { // .. refresh colored preview icon if (widgetProperty != null) { latestFont = widgetProperty.getPropertyValue(); if (latestFont != null) { setCurrentText(latestFont); Font font = SdsUiPlugin.getDefault().getColorAndFontService().getFont(latestFont); if (font != null) { fontDialog.setFontList(new FontData[] { font.getFontData()[0] }); } } } } /** *{@inheritDoc} */ @Override public void selectionChanged(SelectionChangedEvent event) { final NamedFont namedColor = (NamedFont) ((IStructuredSelection) event.getSelection()).getFirstElement(); applyPropertyChange(namedColor.toFontString()); } /** *{@inheritDoc} */ @Override protected List<IContentProposal> getContentProposals(FontProperty property, AbstractWidgetModel selectedWidget, List<AbstractWidgetModel> selectedWidgets) { List<IContentProposal> proposals = new ArrayList<IContentProposal>(); List<NamedFont> fonts = SdsUiPlugin.getDefault().getColorAndFontService().listAvailableFonts(); for (NamedFont f : fonts) { proposals.add(new NamedFontContentProposal(f)); } return proposals; } /** * Content proposal for named fonts. * * @author Sven Wende * */ private static final class NamedFontContentProposal implements IContentProposal { private NamedFont namedFont; public NamedFontContentProposal(NamedFont namedColor) { assert namedColor != null; this.namedFont = namedColor; } @Override public String getContent() { return "${" + namedFont.getName() + "}"; } @Override public int getCursorPosition() { return 0; } @Override public String getDescription() { return namedFont.getDescription(); } @Override public String getLabel() { return namedFont.getName(); } } }