package eu.jucy.gui.statusline;
import helpers.GH;
import helpers.IObservable;
import helpers.Observable.IObserver;
import java.net.InetAddress;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.PlatformUI;
import uc.Identity;
import uc.ConnectionDeterminator.CDState;
import uihelpers.SUIJob;
import eu.jucy.gui.Lang;
import eu.jucy.gui.texteditor.hub.HubEditor;
public class ConnectionStatus extends Label implements IObserver<String> {
private final int size;
private final Identity id;
public ConnectionStatus(Composite comp,Identity id, int size) {
super(comp,SWT.NONE);
this.id = id;
Rectangle rect = HubEditor.GREEN_LED.getBounds();
int originalSize = rect.height;
size = Math.min(originalSize, size);
size = size == originalSize ? SWT.DEFAULT : size;
if (size != SWT.DEFAULT && size < 20) {
size = 20;
}
this.size = size;
PlatformUI.getWorkbench().getHelpSystem().setHelp(this, "ConnectionStatus");
updateLabel();
pack();
id.getConnectionDeterminator().addObserver(this);
}
public void update(IObservable<String> o, String arg) {
new SUIJob(this) {
@Override
public void run() {
updateLabel();
}
}.schedule();
}
public void dispose() {
id.getConnectionDeterminator().deleteObserver(ConnectionStatus.this);
super.dispose();
}
private void updateLabel() {
if (id.isActive()) {
CDState cd = id.getConnectionDeterminator().getState();
switch (cd.getWarningState()) {
case 0:
setImage(HubEditor.GREEN_LED);
break;
case 1:
setImage(HubEditor.YELLOW_LED);
break;
case 2:
case 3:
setImage(HubEditor.RED_LED);
break;
}
InetAddress ia = id.getConnectionDeterminator().getPublicIP();
String publicIP = "";
if (ia != null) {
publicIP = ia.getHostAddress();
}
String s = String.format(Lang.CSToolTip,
publicIP,
(cd.isNatPresent()?
Lang.CSNATDetected :
Lang.CSNoNATDetected),
getString(cd.getTcpWorking()),
getString(cd.getTLSWorking()),
getString(cd.getUdpWorking()),
getString(cd.getUPnPWorking()) );
String sol = cd.getProblemSolution();
if (!GH.isEmpty(sol)) {
s+="\n"+sol;
}
setToolTipText(s);
} else {
setImage(HubEditor.GREY_LED);
setToolTipText(Lang.CSPassiveMode);
}
redraw();
}
private static String getString(Boolean b) {
if (b == null) {
return Lang.CSUNKNOWN;
} else if (b) {
return Lang.CSWORKING;
}else {
return Lang.CSNOTWORKING;
}
}
public void setImage(Image img) {
if (size == SWT.DEFAULT) {
super.setImage(img);
} else {
Image old = getImage();
Image newImage = new Image(img.getDevice(),size,size);
GC gc = new GC(newImage);
gc.setBackground(getBackground());
gc.setForeground(getForeground());
gc.setAdvanced(true);
gc.setAntialias(SWT.ON);
gc.setInterpolation(SWT.HIGH);
gc.drawRectangle(newImage.getBounds());
gc.fillRectangle(newImage.getBounds());
gc.drawImage(img, 0, 0, img.getBounds().width, img.getBounds().height, 0, 0, size, size);
gc.dispose();
super.setImage(newImage);
if (old != null) {
old.dispose();
}
}
}
protected void checkSubclass () {}
}