Package org.gudy.azureus2.ui.swt.mainwindow

Source Code of org.gudy.azureus2.ui.swt.mainwindow.SystemWarningWindow

/**
* 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();
  }
}
TOP

Related Classes of org.gudy.azureus2.ui.swt.mainwindow.SystemWarningWindow

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.