Merge branch 'patch/JAL-4298_synchronize_consoledoc' into develop
authorJames Procter <j.procter@dundee.ac.uk>
Sun, 22 Oct 2023 10:59:21 +0000 (11:59 +0100)
committerJames Procter <j.procter@dundee.ac.uk>
Sun, 22 Oct 2023 10:59:21 +0000 (11:59 +0100)
 Conflicts:
src/jalview/gui/Console.java
still needs some tidying up

1  2 
src/jalview/gui/Console.java

@@@ -50,10 -50,10 +50,11 @@@ import javax.swing.JLabel
  import javax.swing.JPanel;
  import javax.swing.JScrollPane;
  import javax.swing.JTextArea;
+ import javax.swing.SwingUtilities;
  import javax.swing.border.Border;
  import javax.swing.text.DefaultCaret;
  
 +import jalview.bin.Cache;
  import jalview.log.JLoggerI.LogLevel;
  import jalview.log.JLoggerLog4j;
  import jalview.log.JalviewAppender;
@@@ -107,7 -107,7 +108,7 @@@ public class Console extends WindowAdap
  
    private JComboBox<LogLevel> logLevelCombo = new JComboBox<LogLevel>();
  
 -  protected LogLevel startingLogLevel = LogLevel.INFO;
 +  protected LogLevel startingLogLevel = null;
  
    public Console()
    {
      scrollPane.setBorder(noBorder);
      textArea.addMouseListener(new MouseAdapter()
      {
 +      @Override
        public void mouseClicked(MouseEvent e)
        {
          if (e.getButton() == MouseEvent.BUTTON1)
              MessageManager.getString("label.copy_to_clipboard"));
      copyToClipboardButton.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          copyConsoleTextToClipboard();
  
        private Color fg = textArea.getForeground();
  
 +      @Override
        public void mousePressed(MouseEvent e)
        {
          textArea.setBackground(textArea.getSelectionColor());
          textArea.setForeground(textArea.getSelectedTextColor());
        }
  
 +      @Override
        public void mouseReleased(MouseEvent e)
        {
          textArea.setBackground(bg);
      // logLevelCombo.addItem(LogLevel.ERROR);
      // logLevelCombo.addItem(LogLevel.OFF);
      // set startingLogLevel
 -    startingLogLevel = jalview.bin.Console.log == null ? LogLevel.INFO
 -            : jalview.bin.Console.log.getLevel();
 +    
 +    if (jalview.bin.Console.getLogger() == null)
 +    {
 +      startingLogLevel = jalview.bin.Console.getCachedLogLevel();
 +    }
 +    else
 +    {
 +      startingLogLevel = jalview.bin.Console.getLogger().getLevel();
 +    }
      setChosenLogLevelCombo();
      logLevelCombo.addActionListener(new ActionListener()
      {
 +      @Override
        public void actionPerformed(ActionEvent e)
        {
          if (jalview.bin.Console.log != null)
          boolean added = false;
          for (int i = 0; i < logLevelCombo.getItemCount(); i++)
          {
 -          LogLevel l = (LogLevel) logLevelCombo.getItemAt(i);
 +          LogLevel l = logLevelCombo.getItemAt(i);
            if (l.compareTo(setLogLevel) >= 0)
            {
              logLevelCombo.insertItemAt(setLogLevel, i);
     */
    public Console(Desktop desktop)
    {
 -    this(desktop, true);
 -  }
 -
 -  /**
 -   * attach a console to the desktop - the desktop will open it if requested.
 -   * 
 -   * @param desktop
 -   * @param showjconsole
 -   *          - if true, then redirect stdout immediately
 -   */
 -  public Console(Desktop desktop, boolean showjconsole)
 -  {
      parent = desktop;
      // window name - get x,y,width, height possibly scaled
 -    Rectangle bounds = desktop.getLastKnownDimensions("JAVA_CONSOLE_");
 -    if (bounds == null)
 +    Rectangle bounds = parent == null ? null
 +            : parent.getLastKnownDimensions("JAVA_CONSOLE_");
 +    if (bounds != null)
      {
        frame = initFrame(
                ChannelProperties.getProperty("app_name") + " Java Console",
 -              desktop.getWidth() / 2, desktop.getHeight() / 4,
 -              desktop.getX(), desktop.getY());
 +              bounds.width, bounds.height, bounds.x, bounds.y);
 +    }
 +    else if (parent != null && parent.getWidth() > 0
 +            && parent.getHeight() > 0)
 +    {
 +      frame = initFrame(
 +              ChannelProperties.getProperty("app_name") + " Java Console",
 +              parent.getWidth() / 2, parent.getHeight() / 4, parent.getX(),
 +              parent.getY());
      }
      else
      {
        frame = initFrame(
                ChannelProperties.getProperty("app_name") + " Java Console",
 -              bounds.width, bounds.height, bounds.x, bounds.y);
 +              MIN_WIDTH, MIN_HEIGHT, 10, 10);
      }
      frame.setMinimumSize(new Dimension(MIN_WIDTH, MIN_HEIGHT));
 -    // desktop.add(frame);
 +    // parent.add(frame);
      initConsole(false);
      LogLevel level = (LogLevel) logLevelCombo.getSelectedItem();
      if (!Platform.isJS())
          pin.close();
        } catch (Exception e)
        {
 +        jalview.bin.Console.debug("pin.close() error", e);
        }
        try
        {
          pin2.close();
        } catch (Exception e)
        {
 +        jalview.bin.Console.debug("pin2.close() error", e);
        }
        try
        {
          textAppender.join(10);
        } catch (Exception e)
        {
 +        jalview.bin.Console.debug("textAppender.join(10) error", e);
        }
      }
      /*
          {
            try
            {
-             this.wait(100); // ##### implicated BLOCKED
-             if (pin.available() == 0)
-             {
-               trimBuffer(false);
-             }
+             this.wait(100);
 -//            if (pin.available() == 0)
 -//            {
 -//              trimBuffer(false);
 -//            }
            } catch (InterruptedException ie)
            {
 +            jalview.bin.Console.debug("pin.available() error", ie);
            }
          }
  
          {
            try
            {
 -            this.wait(100);
 +            this.wait(100); // ##### implicated BLOCKED
              if (pin2.available() == 0)
              {
                trimBuffer(false);
              }
            } catch (InterruptedException ie)
            {
 +            jalview.bin.Console.debug("pin.available() error", ie);
            }
          }
          while (pin2.available() != 0)
            // check string buffer - if greater than console, clear console and
            // replace with last segment of content, otherwise, append all to
            // content.
-           long count;
            while (displayPipe.length() > 0)
            {
-             count = 0;
              StringBuffer tmp = new StringBuffer(), replace;
              synchronized (displayPipe)
              {
                replace = displayPipe;
                displayPipe = tmp;
              }
-             // simply append whole buffer
-             synchronized (textArea.getDocument())
+             // Append formatted message to textarea using the Swing Thread.
+             SwingUtilities.invokeLater(new Runnable()
              {
-               textArea.append(replace.toString()); // ##### implicated BLOCKED
-               count += replace.length();
-               if (count > byteslim)
+               public void run()
                {
+                 textArea.append(replace.toString());
                  trimBuffer(false);
                }
-             }
+             });            
            }
            if (displayPipe.length() == 0)
            {
                this.wait(100);
                if (displayPipe.length() == 0)
                {
-                 trimBuffer(false);
+                 // post a trim on Swing Thread.
+                 SwingUtilities.invokeLater(new Runnable()
+                 {
+                   public void run()
+                   {
+                     trimBuffer(false);
+                   }
+                 });
                }
              } catch (InterruptedException e)
              {
 +              jalview.bin.Console.debug("displayPipe.length() error", e);
              }
            }
          }
              this.wait(100);
            } catch (InterruptedException e)
            {
 -
 +            jalview.bin.Console.debug("this.wait(100) error", e);
            }
          }
          if (quit)
          this.wait(1000);
        } catch (InterruptedException ie)
        {
 +        jalview.bin.Console.debug("this.wait(1000) error", ie);
        }
        throw new NullPointerException(
                MessageManager.getString("exception.application_test_npe"));
        @Override
        public void run()
        {
-         displayPipe.append(input); // change to stringBuffer
-         // displayPipe.flush();
+         displayPipe.append(input); 
        }
      });
      // stderr.println("Time taken to Spawnappend:\t" + (System.nanoTime() -
                  + "\nTruncated...\n";
        } catch (Exception e)
        {
 -        e.printStackTrace();
 +        jalview.bin.Console.warn("textArea Exception", e);
        }
      }
      // trim the buffer
            }
          } catch (Exception e)
          {
 -          e.printStackTrace();
 +          jalview.bin.Console.warn("textArea Exception", e);
          }
          // lines = textArea.getLineCount();
        }