blob: 2b8ba89c3ed5a2ad58212f9e520202ed881cd785 [file] [log] [blame]
/** Copyright (c) 2017, 2019 Angelo ZERR and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Angelo Zerr <angelo.zerr@gmail.com> - [CodeMining] Provide inline annotations support - Bug 527675
*/
package org.eclipse.jface.text.examples.sources.inlined;
import java.util.function.Consumer;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.inlined.LineContentAnnotation;
import org.eclipse.jface.util.Geometry;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.ColorDialog;
import org.eclipse.swt.widgets.Shell;
/**
* Color annotation displays a colorized square before the rgb declaration.
*/
public class ColorAnnotation extends LineContentAnnotation {
private Color color;
private Consumer<MouseEvent> action = e -> {
StyledText styledText = super.getTextWidget();
Shell shell = new Shell(styledText.getDisplay());
Rectangle location = Geometry.toDisplay(styledText, new Rectangle(e.x, e.y, 1, 1));
shell.setLocation(location.x, location.y);
// Open color dialog
ColorDialog dialog = new ColorDialog(shell);
// dialog.setRGB(annotation.getRGBA().rgb);
RGB color = dialog.open();
if (color != null) {
// Color was selected, update the viewer
try {
int offset = getPosition().getOffset();
IDocument document = getViewer().getDocument();
IRegion line = document.getLineInformation(document.getLineOfOffset(offset));
int length = line.getLength() - (offset - line.getOffset());
String rgb = formatToRGB(color);
document.replace(offset, length, rgb);
} catch (BadLocationException e1) {
}
}
};
/**
* Format the given rgb to hexa color.
*
* @param rgb
* @return the hexa color from the given rgb.
*/
private static String formatToRGB(RGB rgb) {
return new StringBuilder("rgb(").append(rgb.red).append(",").append(rgb.green).append(",").append(rgb.blue)
.append(")").toString();
}
public ColorAnnotation(Position pos, ISourceViewer viewer) {
super(pos, viewer);
}
public void setColor(Color color) {
this.color = color;
}
@Override
protected int drawAndComputeWidth(GC gc, StyledText textWidget, int offset, int length, Color color, int x, int y) {
FontMetrics fontMetrics = gc.getFontMetrics();
int size = getSquareSize(fontMetrics);
x += fontMetrics.getLeading();
y += fontMetrics.getDescent();
Rectangle rect = new Rectangle(x, y, size, size);
// Fill square
gc.setBackground(this.color);
gc.fillRectangle(rect);
// Draw square box
gc.setForeground(textWidget.getForeground());
gc.drawRectangle(rect);
return getSquareWidth(gc.getFontMetrics());
}
/**
* Returns the colorized square size.
*
* @param fontMetrics
* @return the colorized square size.
*/
public static int getSquareSize(FontMetrics fontMetrics) {
return fontMetrics.getHeight() - 2 * fontMetrics.getDescent();
}
/**
* Compute width of square
*
* @param styledText
* @return the width of square
*/
private static int getSquareWidth(FontMetrics fontMetrics) {
// width = 2 spaces + size width of square
int width = (int) (2 * fontMetrics.getAverageCharacterWidth() + getSquareSize(fontMetrics));
return width;
}
@Override
public Consumer<MouseEvent> getAction(MouseEvent e) {
return action;
}
}