View Javadoc

    1   /*
    2    * Licensed to the Apache Software Foundation (ASF) under one or more
    3    * contributor license agreements.  See the NOTICE file distributed with
    4    * this work for additional information regarding copyright ownership.
    5    * The ASF licenses this file to You under the Apache License, Version 2.0
    6    * (the "License"); you may not use this file except in compliance with
    7    * the License.  You may obtain a copy of the License at
    8    *
    9    *      http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17  package org.apache.log4j.chainsaw;
    18
    19  import java.awt.BorderLayout;
    20  import java.awt.Color;
    21  import java.awt.Point;
    22  import java.awt.event.ActionEvent;
    23  import java.awt.event.ActionListener;
    24
    25  import javax.swing.JButton;
    26  import javax.swing.JDialog;
    27  import javax.swing.JEditorPane;
    28  import javax.swing.JFrame;
    29  import javax.swing.JScrollPane;
    30  import javax.swing.ScrollPaneConstants;
    31  import javax.swing.SwingUtilities;
    32  import javax.swing.event.HyperlinkEvent;
    33  import javax.swing.event.HyperlinkListener;
    34
    35  import org.apache.log4j.Logger;
    36  import org.apache.log4j.chainsaw.help.HelpManager;
    37
    38  /**
    39   * A simple About box telling people stuff about this project
    40   *
    41   * @author Paul Smith &lt;psmith@apache.org&gt;
    42   *
    43   */
    44  class ChainsawAbout extends JDialog {
    45      private static final Logger LOG = Logger.getLogger(ChainsawAbout.class);
    46
    47      private final JEditorPane editPane = new JEditorPane("text/html", "");
    48
    49      private final JScrollPane scrollPane = new JScrollPane(editPane,
    50              ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER,
    51              ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    52
    53      private final String url = ChainsawAbout.class.getName().replace('.', '/')
    54              + ".html";
    55
    56      private boolean sleep = false;
    57
    58      private final Object guard = new Object();
    59
    60      ChainsawAbout(JFrame parent) {
    61          super(parent, "About Chainsaw v2", true);
    62          // setResizable(false);
    63          setBackground(Color.white);
    64          getContentPane().setLayout(new BorderLayout());
    65
    66          JButton closeButton = new JButton(" Close ");
    67          closeButton.addActionListener(new ActionListener() {
    68              public void actionPerformed(ActionEvent e) {
    69                  setVisible(false);
    70              }
    71          });
    72          closeButton.setDefaultCapable(true);
    73
    74          try {
    75              editPane.setPage(this.getClass().getClassLoader().getResource(url));
    76          } catch (Exception e) {
    77              throw new RuntimeException("Failed to find the About panel HTML", e);
    78          }
    79          getContentPane().add(scrollPane, BorderLayout.CENTER);
    80          getContentPane().add(closeButton, BorderLayout.SOUTH);
    81          JTextComponentFormatter.applySystemFontAndSize(editPane);
    82
    83          editPane.setEditable(false);
    84          editPane.addHyperlinkListener(
    85                  new HyperlinkListener() {
    86                      public void hyperlinkUpdate(HyperlinkEvent e) {
    87                        if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
    88                            HelpManager.getInstance().setHelpURL(e.getURL());
    89                        }
    90                      }
    91                    });
    92
    93          setSize(320, 240);
    94          new Thread(new Scroller()).start();
    95          scrollPane.getViewport().setViewPosition(new Point(0, 0));
    96
    97          setLocationRelativeTo(parent);
    98      }
    99
    100     private class Scroller implements Runnable {
    101
    102         public void run() {
    103             while (true) {
    104                 try {
    105                     if (sleep) {
    106                         synchronized (guard) {
    107                             guard.wait();
    108                         }
    109                             SwingUtilities.invokeLater(new Runnable() {
    110                                 public void run() {
    111                                     scrollPane.getViewport().setViewPosition(
    112                                             new Point(0, 0));
    113                                 }
    114                             });
    115                         continue;
    116                     }
    117                     SwingUtilities.invokeLater(new Runnable() {
    118                         public void run() {
    119                             scrollPane.getViewport().setViewPosition(
    120                                     new Point(0, scrollPane.getViewport()
    121                                             .getViewPosition().y + 1));
    122                         }
    123                     });
    124                     Thread.sleep(100);
    125                 } catch (Exception e) {
    126                     LOG.error("Error during scrolling", e);
    127                 }
    128
    129             }
    130         }
    131     }
    132
    133     public void setVisible(boolean visible) {
    134         super.setVisible(visible);
    135         sleep = !visible;
    136         synchronized (guard) {
    137             guard.notifyAll();
    138         }
    139     }
    140 }