/**
*
*/
package org.xmind.ui.datepicker;
import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.GridData;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Layer;
import org.eclipse.draw2d.LayeredPane;
import org.eclipse.draw2d.LayoutManager;
import org.eclipse.draw2d.StackLayout;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.xmind.gef.draw2d.graphics.AlphaGraphics;
public class BaseFigure extends Figure {
public static Object PRESELECTED = "PRESELECTED"; //$NON-NLS-1$
public static Object SELECTED = "SELECTED"; //$NON-NLS-1$
public static Object PRESSED = "PRESSED"; //$NON-NLS-1$
public static Object CONTENT = "CONTENT"; //$NON-NLS-1$
private double alpha = 255;
private LayeredPane pane = new LayeredPane();
public BaseFigure() {
setLayoutManager(new StackLayout());
setOpaque(false);
add(pane);
addLayers();
setCursor(Display.getCurrent().getSystemCursor(SWT.CURSOR_HAND));
}
protected void addLayers() {
addFeedbackLayers();
addContentLayer();
}
protected void addFeedbackLayers() {
addSelectFeedbackLayer();
addPressFeedbackLayer();
addPreselectFeedbackLayer();
}
protected void addPreselectFeedbackLayer() {
pane.add(new PreselectFeedbackLayer(), PRESELECTED, -1);
}
protected void addPressFeedbackLayer() {
pane.add(new PressFeedbackLayer(), PRESSED, -1);
}
protected void addSelectFeedbackLayer() {
pane.add(new SelectFeedbackLayer(), SELECTED, -1);
}
protected void addContentLayer() {
pane.add(new TextLayer(), CONTENT, -1);
}
public void setContentLayer(IFigure content) {
removeOldContent();
pane.add(content, CONTENT, -1);
}
private void removeOldContent() {
Layer content = pane.getLayer(CONTENT);
if (content != null)
pane.remove(content);
}
public void setContentLayerAfter(Layer content, Object after) {
removeOldContent();
pane.addLayerAfter(content, CONTENT, after);
}
public void setContentLayerBefore(Layer content, Object before) {
removeOldContent();
pane.addLayerBefore(content, CONTENT, before);
}
public IFigure getContent() {
return pane.getLayer(CONTENT);
}
public String getText() {
IFigure content = getContent();
if (content instanceof TextLayer)
return ((TextLayer) content).getText();
return null;
}
public void setText(String text) {
IFigure content = getContent();
if (content instanceof TextLayer)
((TextLayer) content).setText(text);
}
public void setTextCandidates(String[] candidates) {
IFigure content = getContent();
if (content instanceof TextLayer)
((TextLayer) content).setCandidates(candidates);
}
public void setTextAlpha(int alpha) {
IFigure content = getContent();
if (content instanceof TextLayer)
((TextLayer) content).setAlpha(alpha);
}
@Override
public void paint(Graphics graphics) {
AlphaGraphics g = new AlphaGraphics(graphics);
g.setMainAlpha((int) alpha);
g.setAntialias(SWT.ON);
super.paint(g);
g.dispose();
}
public void setAlpha(double alpha) {
this.alpha = alpha;
repaint();
}
public double getAlpha() {
return alpha;
}
public boolean isPreselected() {
Layer layer = pane.getLayer(PRESELECTED);
return layer != null && layer.isVisible();
}
public void setPreselected(boolean value) {
Layer layer = pane.getLayer(PRESELECTED);
if (layer != null) {
layer.setVisible(value);
}
}
public boolean isSelected() {
Layer layer = pane.getLayer(SELECTED);
return layer != null && layer.isVisible();
}
public void setSelected(boolean value) {
Layer layer = pane.getLayer(SELECTED);
if (layer != null) {
layer.setVisible(value);
this.setForegroundColor(
value ? ColorConstants.white : ColorConstants.black);
}
}
public boolean isPressed() {
Layer layer = pane.getLayer(PRESSED);
return layer != null && layer.isVisible();
}
public void setPressed(boolean value) {
Layer layer = pane.getLayer(PRESSED);
if (layer != null) {
layer.setVisible(value);
}
IFigure content = getContent();
if (content instanceof TextLayer)
((TextLayer) content).setOffset(value ? 1 : 0, value ? 1 : 0);
}
@Override
public Dimension getPreferredSize(int wHint, int hHint) {
Dimension psize = super.getPreferredSize(wHint, hHint);
if (getParent() != null) {
LayoutManager layout = getParent().getLayoutManager();
if (layout != null) {
Object constraint = layout.getConstraint(this);
if (constraint instanceof GridData) {
int h = ((GridData) constraint).horizontalSpan;
if (h > 1) {
psize = psize.getCopy();
psize.width = psize.width / h;
}
}
}
}
return psize;
}
}