package org.reldb.dbrowser.ui.monitors;
import java.util.Timer;
import java.util.TimerTask;
import org.eclipse.swt.widgets.Caret;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.wb.swt.SWTResourceManager;
import org.reldb.dbrowser.ui.updates.UpdatesCheck;
import org.reldb.dbrowser.ui.updates.UpdatesCheckDialog;
import org.reldb.dbrowser.ui.updates.UpdatesCheck.SendStatus;
import org.reldb.dbrowser.utilities.FontSize;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.GridData;
public class CheckForUpdates extends Composite {
private UpdatesCheck updateChecker;
private StyledText txtStatus;
private MouseAdapter mouseHandler = new MouseAdapter() {
@Override
public void mouseUp(MouseEvent event) {
UpdatesCheckDialog.launch(getShell());
}
};
private void makeRelItalic() {
StyleRange italic = new StyleRange();
italic.start = 0;
italic.length = 3;
italic.fontStyle = SWT.ITALIC;
txtStatus.setStyleRange(italic);
}
private void centreText() {
GC gc = new GC(txtStatus);
Point textExtent = gc.textExtent(txtStatus.getText());
txtStatus.setMargins(2, (CheckForUpdates.this.getSize().y - textExtent.y) / 2, 2, 0);
}
private void setText(String text) {
txtStatus.setText(text);
makeRelItalic();
centreText();
getParent().layout();
}
protected void completed(SendStatus sendStatus) {
try {
if (sendStatus.getResponse() != null && sendStatus.getResponse().startsWith("Success")) {
String updateURL = UpdatesCheck.getUpdateURL(sendStatus);
if (updateURL != null) {
System.out.println("CheckForUpdates: Rel update is available at " + updateURL);
setText("Rel update is available.");
txtStatus.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLACK));
txtStatus.setBackground(SWTResourceManager.getColor(255, 200, 200));
} else {
System.out.println("CheckForUpdates: Rel is up to date.");
setText("Rel is up to date.");
txtStatus.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN));
}
}
} catch (Exception e) {
System.out.println("CheckForUpdates: exception: " + e);
}
}
/**
* Create the composite.
* @param parent
* @param style
*/
public CheckForUpdates(Composite parent, int style) {
super(parent, style);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginHeight = 0;
gridLayout.marginWidth = 0;
gridLayout.verticalSpacing = 0;
gridLayout.horizontalSpacing = 0;
setLayout(gridLayout);
setVisible(false);
txtStatus = new StyledText(this, SWT.WRAP);
txtStatus.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
txtStatus.setEditable(false);
txtStatus.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLACK));
txtStatus.setBackground(getBackground());
txtStatus.setFont(FontSize.getThisFontInNewSize(txtStatus.getFont(), 10, SWT.NORMAL));
txtStatus.addMouseListener(mouseHandler);
txtStatus.setCaret(new Caret(txtStatus, SWT.NONE));
setText("Rel updates?");
updateChecker = new UpdatesCheck(parent.getDisplay()) {
@Override
public void completed(SendStatus sendStatus) {
CheckForUpdates.this.completed(sendStatus);
}
};
TimerTask checkForUpdates = new TimerTask() {
@Override
public void run() {
if (CheckForUpdates.this.isDisposed())
return;
getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
if (CheckForUpdates.this.isDisposed())
return;
setVisible(true);
setText("Rel updates?");
System.out.println("CheckForUpdates: check for updates.");
updateChecker.doCancel();
updateChecker.doSend();
}
});
}
};
// Check for updates after 10 seconds, then every 12 hours
Timer checkTimer = new Timer();
checkTimer.schedule(checkForUpdates, 1000 * 5, 1000 * 60 * 60 * 12);
}
}