package de.urszeidler.shr5.runtime.ui.widgets;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.forms.widgets.FormToolkit;
/**
* Defines a state monitor for one damage state.
*
* @author urs
*/
public class StateMonitorWidget extends Composite implements IPropertyListener {
private final FormToolkit toolkit = new FormToolkit(Display.getCurrent());
private int maxConditions;
private Composite composite_state;
private List<SingleStateWidget> stateMonitors;
private int style;
private int column = 3;
private boolean showLable = true;
private int damage;
private MonitorType type;
public enum MonitorType{
physical,mental,overflow,edge
}
/**
* Create the composite.
*
* @param parent
* @param style
*/
public StateMonitorWidget(Composite parent, int style) {
super(parent, style);
maxConditions = 11;
this.style = style;
setLayout(new FillLayout(SWT.HORIZONTAL));
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
toolkit.dispose();
}
});
toolkit.adapt(this);
toolkit.paintBordersFor(this);
init();
}
/**
* Create the composite.
*
* @param parent
* @param style
*/
public StateMonitorWidget(Composite parent, int style, int column, boolean showlable) {
super(parent, style);
maxConditions = 11;
this.column = column;
this.showLable = showlable;
this.style = style;
setLayout(new FillLayout(SWT.HORIZONTAL));
addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
toolkit.dispose();
}
});
toolkit.adapt(this);
toolkit.paintBordersFor(this);
init();
}
private void init() {
if (composite_state != null)
composite_state.dispose();
composite_state = new Composite(this, SWT.NONE);
GridLayout layout = new GridLayout(column + 1, false);
layout.marginWidth = 2;
layout.marginHeight = 2;
layout.horizontalSpacing = 0;
layout.verticalSpacing = 0;
composite_state.setLayout(layout);
toolkit.adapt(composite_state);
toolkit.paintBordersFor(composite_state);
int value = maxConditions;
stateMonitors = new ArrayList<SingleStateWidget>(value);
for (int i = 1; i <= value; i++) {
SingleStateWidget stateWidget = new SingleStateWidget(composite_state, style);
GridData gridData = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
stateWidget.setLayoutData(gridData);
stateWidget.setChangeListener(this);
stateWidget.setType(type);
stateMonitors.add(stateWidget);
if (showLable)
if (i % column == 0) {
Label label = toolkit.createLabel(composite_state, "", style);
label.setText("" + ((i / column)) * -1);
}
}
}
public void setDamage(int damage) {
for (int i = 0; i < stateMonitors.size(); i++) {
SingleStateWidget singleStateWidget = stateMonitors.get(i);
singleStateWidget.setMarkt(i < damage);
this.damage = damage;
}
}
@Override
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
public void setMaxConditions(int maxConditions) {
this.maxConditions = maxConditions;
init();
this.layout(true, true);
}
@Override
public void propertyChanged(Object source, int propId) {
if (source instanceof SingleStateWidget) {
SingleStateWidget ssw = (SingleStateWidget)source;
int indexOf = stateMonitors.indexOf(source) + 1;
if (ssw.isMarkt()) {
if (indexOf == damage)
setDamage(0);
else
setDamage(indexOf);
} else
setDamage(indexOf);
Event event = new Event();
event.widget = this;
notifyListeners(SWT.CHANGED, event);
}
}
public int getDamage() {
return damage;
}
public void setType(MonitorType type) {
this.type = type;
}
}