Merge branch 'patch/JAL-4298_synchronize_consoledoc' into bug/JAL-4298_java_console_c...
authorBen Soares <b.soares@dundee.ac.uk>
Thu, 19 Oct 2023 20:06:00 +0000 (21:06 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Thu, 19 Oct 2023 20:06:00 +0000 (21:06 +0100)
1  2 
src/jalview/gui/Console.java

@@@ -53,7 -53,6 +53,7 @@@ import javax.swing.JTextArea
  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 -106,7 +107,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.log == null)
 +    {
 +      try
 +      {
 +        startingLogLevel = LogLevel
 +                .valueOf(Cache.getDefault(Cache.JALVIEWLOGLEVEL, null));
 +      } catch (IllegalArgumentException e1)
 +      {
 +        jalview.bin.Console.debug(
 +                "Invalid value for preference " + Cache.JALVIEWLOGLEVEL);
 +      } catch (NullPointerException e2)
 +      {
 +        // no value in preferences
 +      } finally
 +      {
 +        if (startingLogLevel == null)
 +        {
 +          startingLogLevel = LogLevel.INFO;
 +        }
 +      }
 +    }
 +    else
 +    {
 +      startingLogLevel = jalview.bin.Console.log.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",
 +              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",
 -              desktop.getWidth() / 2, desktop.getHeight() / 4,
 -              desktop.getX(), desktop.getY());
 +              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);
 +            this.wait(100); // ##### implicated BLOCKED
              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)
                displayPipe = tmp;
              }
              // simply append whole buffer
-             textArea.append(replace.toString()); // ##### implicated BLOCKED
-             count += replace.length();
-             if (count > byteslim)
+             synchronized (textArea.getDocument())
              {
-               trimBuffer(false);
+               textArea.append(replace.toString());
+               count += replace.length();
+               if (count > byteslim)
+               {
+                 trimBuffer(false);
+               }
              }
 -            
++
            }
            if (displayPipe.length() == 0)
            {
                }
              } 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"));
                  + "\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();
        }