/**
* Created on Jan 4, 2010
*
* Copyright 2008 Vuze, Inc. All rights reserved.
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.gudy.azureus2.ui.swt.mainwindow;
import java.util.ArrayList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.logging.LogAlert;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Constants;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.ui.swt.Alerts;
import org.gudy.azureus2.ui.swt.Messages;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.shells.GCStringPrinter;
import org.gudy.azureus2.ui.swt.shells.MessageBoxShell;
import org.gudy.azureus2.ui.swt.shells.GCStringPrinter.URLInfo;
import com.aelitis.azureus.ui.swt.imageloader.ImageLoader;
import com.aelitis.azureus.ui.swt.utils.ColorCache;
/**
* @author TuxPaper
* @created Jan 4, 2010
*
*/
public class SystemWarningWindow
{
private final static int WIDTH = 230;
private final static int BORDER_X = 12;
private final static int BORDER_Y0 = 10;
private final static int BORDER_Y1 = 6;
private final static int GAP_Y = 5;
private final static int GAP_BUTTON_Y = 20;
private final static int GAP_Y_TITLE_COUNT = 3;
private final LogAlert logAlert;
private final Point ptBottomRight;
private final Shell parent;
private Shell shell;
private Image imgClose;
private Rectangle boundsClose;
private GCStringPrinter spText;
private GCStringPrinter spTitle;
private GCStringPrinter spCount;
private Point sizeTitle;
private Point sizeText;
private Point sizeCount;
private Font fontTitle;
private Font fontCount;
private int height;
private Rectangle rectX;
private int historyPosition;
private String title;
private String text;
public static int numWarningWindowsOpen = 0;
public SystemWarningWindow(LogAlert logAlert, Point ptBottomRight,
Shell parent, int historyPosition) {
this.logAlert = logAlert;
this.ptBottomRight = ptBottomRight;
this.parent = parent;
this.historyPosition = historyPosition;
String amb_key_suffix;
switch (logAlert.entryType) {
case LogAlert.AT_ERROR:
amb_key_suffix = "error";
break;
case LogAlert.AT_INFORMATION:
amb_key_suffix = "information";
break;
case LogAlert.AT_WARNING:
amb_key_suffix = "warning";
break;
default:
amb_key_suffix = null;
break;
}
title = amb_key_suffix == null ? Constants.APP_NAME
: MessageText.getString("AlertMessageBox." + amb_key_suffix);
if (logAlert.text.startsWith("{")) {
text = MessageText.expandValue(logAlert.text);
} else {
text = logAlert.text;
}
if (logAlert.err != null) {
text += "\n" + Debug.getExceptionMessage(logAlert.err);
}
if (logAlert.details != null) {
text += "\n<A HREF=\"details\">" + MessageText.getString("v3.MainWindow.button.viewdetails") + "</A>";
}
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
openWindow();
}
});
}
protected void openWindow() {
Display display = parent.getDisplay();
//shell = new Shell(parent, SWT.TOOL | SWT.TITLE | SWT.CLOSE);
//shell.setText("Warning (X of X)");
shell = new Shell(parent, SWT.TOOL);
shell.setLayout(new FormLayout());
shell.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
shell.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
Menu menu = new Menu(shell);
MenuItem menuItem = new MenuItem(menu, SWT.PUSH);
Messages.setLanguageText(menuItem, "MyTorrentsView.menu.thisColumn.toClipboard");
menuItem.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
ClipboardCopy.copyToClipBoard(logAlert.text
+ (logAlert.details == null ? "" : "\n" + logAlert.details));
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
shell.setMenu(menu);
ImageLoader imageLoader = ImageLoader.getInstance();
imgClose = imageLoader.getImage("image.systemwarning.closeitem");
boundsClose = imgClose.getBounds();
GC gc = new GC(shell);
FontData[] fontdata = gc.getFont().getFontData();
fontdata[0].setHeight(fontdata[0].getHeight() + 1);
fontdata[0].setStyle(SWT.BOLD);
fontTitle = new Font(display, fontdata);
fontdata = gc.getFont().getFontData();
fontdata[0].setHeight(fontdata[0].getHeight() - 1);
fontCount = new Font(display, fontdata);
shell.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
Utils.disposeSWTObjects(new Object[] {
fontTitle,
fontCount,
});
numWarningWindowsOpen--;
}
});
Rectangle printArea = new Rectangle(BORDER_X, 0, WIDTH - (BORDER_X * 2),
5000);
spText = new GCStringPrinter(gc, text, printArea, true, false, SWT.WRAP);
spText.setUrlColor(Colors.blues[Colors.FADED_DARKEST]);
spText.calculateMetrics();
gc.setFont(fontCount);
String sCount = MessageText.getString("OpenTorrentWindow.xOfTotal",
new String[] {
"" + historyPosition + 1,
"" + getWarningCount()
});
spCount = new GCStringPrinter(gc, sCount, printArea, true, false, SWT.WRAP);
spCount.calculateMetrics();
gc.setFont(fontTitle);
spTitle = new GCStringPrinter(gc, title, printArea, true, false, SWT.WRAP);
spTitle.calculateMetrics();
gc.dispose();
sizeText = spText.getCalculatedSize();
sizeTitle = spTitle.getCalculatedSize();
sizeCount = spCount.getCalculatedSize();
FormData fd;
Button btnDismiss = new Button(shell, SWT.PUSH);
Messages.setLanguageText(btnDismiss, "Button.dismiss");
final int btnHeight = btnDismiss.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
Button btnPrev = new Button(shell, SWT.PUSH);
btnPrev.setText("<");
Button btnNext = new Button(shell, SWT.PUSH);
btnNext.setText(">");
fd = new FormData();
fd.bottom = new FormAttachment(100, -BORDER_Y1);
fd.right = new FormAttachment(100, -BORDER_X);
btnNext.setLayoutData(fd);
fd = new FormData();
fd.bottom = new FormAttachment(100, -BORDER_Y1);
fd.right = new FormAttachment(btnNext, -BORDER_X);
btnPrev.setLayoutData(fd);
fd = new FormData();
fd.bottom = new FormAttachment(100, -BORDER_Y1);
fd.right = new FormAttachment(btnPrev, -BORDER_X);
btnDismiss.setLayoutData(fd);
height = BORDER_Y0 + sizeTitle.y + GAP_Y + sizeText.y + GAP_Y_TITLE_COUNT
+ sizeCount.y + GAP_BUTTON_Y + btnHeight + BORDER_Y1;
Rectangle area = shell.computeTrim(ptBottomRight.x - WIDTH, ptBottomRight.y
- height, WIDTH, height);
shell.setBounds(area);
shell.setLocation(ptBottomRight.x - area.width, ptBottomRight.y
- area.height - 2);
rectX = new Rectangle(area.width - BORDER_X - boundsClose.width, BORDER_Y0,
boundsClose.width, boundsClose.height);
shell.addMouseMoveListener(new MouseMoveListener() {
int lastCursor = SWT.CURSOR_ARROW;
public void mouseMove(MouseEvent e) {
if (shell == null || shell.isDisposed()) {
return;
}
URLInfo hitUrl = spText.getHitUrl(e.x, e.y);
int cursor = (rectX.contains(e.x, e.y)) || hitUrl != null
? SWT.CURSOR_HAND : SWT.CURSOR_ARROW;
if (cursor != lastCursor) {
lastCursor = cursor;
shell.setCursor(e.display.getSystemCursor(cursor));
}
}
});
shell.addMouseListener(new MouseListener() {
public void mouseUp(MouseEvent e) {
if (shell == null || shell.isDisposed()) {
return;
}
if (rectX.contains(e.x, e.y)) {
shell.dispose();
}
URLInfo hitUrl = spText.getHitUrl(e.x, e.y);
if (hitUrl != null) {
if (hitUrl.url.equals("details")) {
MessageBoxShell mb = new MessageBoxShell(Constants.APP_NAME,
logAlert.details, new String[] {
MessageText.getString("Button.ok")
}, 0);
mb.setUseTextBox(true);
mb.setParent(Utils.findAnyShell());
mb.open(null);
} else {
Utils.launch(hitUrl.url);
}
}
}
public void mouseDown(MouseEvent e) {
}
public void mouseDoubleClick(MouseEvent e) {
}
});
shell.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent e) {
e.gc.drawImage(imgClose, WIDTH - BORDER_X - boundsClose.width,
BORDER_Y0);
Rectangle printArea;
printArea = new Rectangle(BORDER_X, BORDER_Y0 + sizeTitle.y + GAP_Y_TITLE_COUNT,
WIDTH, 100);
String sCount = MessageText.getString("OpenTorrentWindow.xOfTotal",
new String[] {
"" + (historyPosition + 1),
"" + getWarningCount()
});
e.gc.setAlpha(180);
Font lastFont = e.gc.getFont();
e.gc.setFont(fontCount);
spCount = new GCStringPrinter(e.gc, sCount, printArea, true, false,
SWT.WRAP | SWT.TOP);
spCount.printString();
e.gc.setAlpha(255);
sizeCount = spCount.getCalculatedSize();
e.gc.setFont(lastFont);
spText.printString(e.gc, new Rectangle(BORDER_X, BORDER_Y0
+ sizeTitle.y + GAP_Y_TITLE_COUNT + sizeCount.y + GAP_Y, WIDTH - BORDER_X
- BORDER_X, 5000), SWT.WRAP | SWT.TOP);
e.gc.setFont(fontTitle);
e.gc.setForeground(ColorCache.getColor(e.gc.getDevice(), "#54728c"));
spTitle.printString(e.gc, new Rectangle(BORDER_X, BORDER_Y0, WIDTH
- BORDER_X - BORDER_X, 5000), SWT.WRAP | SWT.TOP);
e.gc.setLineStyle(SWT.LINE_DOT);
e.gc.setLineWidth(1);
e.gc.setAlpha(180);
e.gc.drawLine(BORDER_X, height - btnHeight - (GAP_BUTTON_Y / 2)
- BORDER_Y1, WIDTH - BORDER_X, height - btnHeight
- (GAP_BUTTON_Y / 2) - BORDER_Y1);
}
});
shell.addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_ESCAPE) {
shell.dispose();
return;
}
}
});
btnPrev.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
ArrayList<LogAlert> alerts = Alerts.getUnviewedLogAlerts();
int pos = historyPosition - 1;
if (pos < 0 || pos >= alerts.size()) {
return;
}
new SystemWarningWindow(alerts.get(pos), ptBottomRight, parent, pos);
shell.dispose();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
btnPrev.setEnabled(historyPosition > 0);
btnNext.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
ArrayList<LogAlert> alerts = Alerts.getUnviewedLogAlerts();
int pos = historyPosition + 1;
if (pos >= alerts.size()) {
return;
}
new SystemWarningWindow(alerts.get(pos), ptBottomRight, parent, pos);
shell.dispose();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
ArrayList<LogAlert> alerts = Alerts.getUnviewedLogAlerts();
btnNext.setEnabled(alerts.size() != historyPosition + 1);
btnDismiss.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
ArrayList<LogAlert> alerts = Alerts.getUnviewedLogAlerts();
for (int i = 0; i < alerts.size() && i <= historyPosition; i++) {
Alerts.markAlertAsViewed(alerts.get(i));
}
shell.dispose();
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
shell.open();
numWarningWindowsOpen++;
}
private int getWarningCount() {
ArrayList<LogAlert> historyList = Alerts.getUnviewedLogAlerts();
return historyList.size();
}
}