Merge branch 'improvement/JAL-3416_default_to_LIVE_DRAG_MODE_for_flatlaf' into merge...
authorBen Soares <b.soares@dundee.ac.uk>
Wed, 9 Nov 2022 17:47:59 +0000 (17:47 +0000)
committerBen Soares <b.soares@dundee.ac.uk>
Wed, 9 Nov 2022 17:47:59 +0000 (17:47 +0000)
1  2 
src/jalview/gui/AlignFrame.java
src/jalview/gui/FeatureSettings.java
src/jalview/gui/JvOptionPane.java
src/jalview/gui/StructureViewerBase.java
src/jalview/gui/UserDefinedColours.java
src/jalview/io/JalviewFileChooser.java

Simple merge
Simple merge
@@@ -1144,89 -1031,6 +1145,89 @@@ public class JvOptionPane extends JOpti
    }
  
    /**
 +   * showDialogOnTop will create a dialog that (attempts to) come to top of OS
 +   * desktop windows
 +   */
 +  public static int showDialogOnTop(String label, String actionString,
 +          int JOPTIONPANE_OPTION, int JOPTIONPANE_MESSAGETYPE)
 +  {
 +    if (!isInteractiveMode())
 +    {
 +      return (int) getMockResponse();
 +    }
 +    // Ensure Jalview window is brought to front (primarily for Quit
 +    // confirmation window to be visible)
 +
 +    // This method of raising the Jalview window is broken in java
 +    // jalviewDesktop.setVisible(true);
 +    // jalviewDesktop.toFront();
 +
 +    // A better hack which works is to create a new JFrame parent with
 +    // setAlwaysOnTop(true)
 +    JFrame dialogParent = new JFrame();
-     dialogParent.setIconImage(WindowIcons.logoIcon.getImage());
++    dialogParent.setIconImage(null);
 +    dialogParent.setAlwaysOnTop(true);
 +
 +    int answer = JOptionPane.showConfirmDialog(dialogParent, label,
 +            actionString, JOPTIONPANE_OPTION, JOPTIONPANE_MESSAGETYPE);
 +
 +    dialogParent.setAlwaysOnTop(false);
 +    dialogParent.dispose();
 +
 +    return answer;
 +  }
 +
 +  public void showDialogOnTopAsync(String label, String actionString,
 +          int JOPTIONPANE_OPTION, int JOPTIONPANE_MESSAGETYPE, Icon icon,
 +          Object[] options, Object initialValue, boolean modal)
 +  {
 +    JFrame frame = new JFrame();
-     frame.setIconImage(WindowIcons.logoIcon.getImage());
++    frame.setIconImage(null);
 +    showDialogOnTopAsync(frame, label, actionString, JOPTIONPANE_OPTION,
 +            JOPTIONPANE_MESSAGETYPE, icon, options, initialValue, modal);
 +  }
 +
 +  public void showDialogOnTopAsync(JFrame dialogParent, Object label,
 +          String actionString, int JOPTIONPANE_OPTION,
 +          int JOPTIONPANE_MESSAGETYPE, Icon icon, Object[] options,
 +          Object initialValue, boolean modal)
 +  {
 +    showDialogOnTopAsync(dialogParent, label, actionString,
 +            JOPTIONPANE_OPTION, JOPTIONPANE_MESSAGETYPE, icon, options,
 +            initialValue, modal, null);
 +  }
 +
 +  public void showDialogOnTopAsync(JFrame dialogParent, Object label,
 +          String actionString, int JOPTIONPANE_OPTION,
 +          int JOPTIONPANE_MESSAGETYPE, Icon icon, Object[] options,
 +          Object initialValue, boolean modal, JButton[] buttons)
 +  {
 +    if (!isInteractiveMode())
 +    {
 +      handleResponse(getMockResponse());
 +      return;
 +    }
 +    // Ensure Jalview window is brought to front (primarily for Quit
 +    // confirmation window to be visible)
 +
 +    // This method of raising the Jalview window is broken in java
 +    // jalviewDesktop.setVisible(true);
 +    // jalviewDesktop.toFront();
 +
 +    // A better hack which works is to create a new JFrame parent with
 +    // setAlwaysOnTop(true)
 +    dialogParent.setAlwaysOnTop(true);
 +    parentComponent = dialogParent;
 +
 +    showDialog(label, actionString, JOPTIONPANE_OPTION,
 +            JOPTIONPANE_MESSAGETYPE, icon, options, initialValue, modal,
 +            buttons);
 +
 +    dialogParent.setAlwaysOnTop(false);
 +    dialogParent.dispose();
 +  }
 +
 +  /**
     * JalviewJS signals option selection by a property change event for the
     * option e.g. "OK". This methods responds to that by running the response
     * action that corresponds to that option.
      {
        return;
      }
 -    Runnable action = callbacks.get(response);
 +    Callable<Void> action = callbacks.get(response);
      if (action != null)
      {
 -      action.run();
 -      parentComponent.requestFocus();
 +      try
 +      {
 +        action.call();
 +      } catch (Exception e)
 +      {
 +        e.printStackTrace();
 +      }
 +      if (parentComponent != null)
 +        parentComponent.requestFocus();
 +    }
 +  }
 +
 +  /**
 +   * Create a non-modal confirm dialog
 +   */
 +  public JDialog createDialog(Component parentComponent, Object message,
 +          String title, int optionType, int messageType, Icon icon,
 +          Object[] options, Object initialValue, boolean modal)
 +  {
 +    return createDialog(parentComponent, message, title, optionType,
 +            messageType, icon, options, initialValue, modal, null);
 +  }
 +
 +  public JDialog createDialog(Component parentComponent, Object message,
 +          String title, int optionType, int messageType, Icon icon,
 +          Object[] options, Object initialValue, boolean modal,
 +          JButton[] buttons)
 +  {
 +    if (!isInteractiveMode())
 +    {
 +      handleResponse(getMockResponse());
 +      return null;
 +    }
 +    JButton[] optionsButtons = null;
 +    Object initialValueButton = null;
 +    JOptionPane joptionpane = new JOptionPane();
 +    // Make button options
 +    int[] buttonActions = { JOptionPane.YES_OPTION, JOptionPane.NO_OPTION,
 +        JOptionPane.CANCEL_OPTION };
 +
 +    // we need the strings to make the buttons with actionEventListener
 +    if (options == null)
 +    {
 +      ArrayList<String> options_default = new ArrayList<>();
 +      options_default.add(UIManager.getString("OptionPane.yesButtonText"));
 +      if (optionType == JOptionPane.YES_NO_OPTION
 +              || optionType == JOptionPane.YES_NO_CANCEL_OPTION)
 +      {
 +        options_default.add(UIManager.getString("OptionPane.noButtonText"));
 +      }
 +      if (optionType == JOptionPane.YES_NO_CANCEL_OPTION)
 +      {
 +        options_default
 +                .add(UIManager.getString("OptionPane.cancelButtonText"));
 +      }
 +      options = options_default.toArray();
 +    }
 +    if (!Platform.isJS()) // JalviewJS already uses callback, don't need to
 +                          // add them here
 +    {
 +      if (((optionType == JOptionPane.YES_OPTION
 +              || optionType == JOptionPane.NO_OPTION
 +              || optionType == JOptionPane.CANCEL_OPTION
 +              || optionType == JOptionPane.OK_OPTION
 +              || optionType == JOptionPane.DEFAULT_OPTION)
 +              && options.length < 1)
 +              || ((optionType == JOptionPane.YES_NO_OPTION
 +                      || optionType == JOptionPane.OK_CANCEL_OPTION)
 +                      && options.length < 2)
 +              || (optionType == JOptionPane.YES_NO_CANCEL_OPTION
 +                      && options.length < 3))
 +      {
 +        jalview.bin.Console
 +                .debug("JvOptionPane: not enough options for dialog type");
 +      }
 +      optionsButtons = new JButton[options.length];
 +      for (int i = 0; i < options.length && i < 3; i++)
 +      {
 +        Object o = options[i];
 +        int buttonAction = buttonActions[i];
 +        Callable<Void> action = callbacks.get(buttonAction);
 +        JButton jb;
 +        if (buttons != null && buttons.length > i && buttons[i] != null)
 +        {
 +          jb = buttons[i];
 +        }
 +        else
 +        {
 +          jb = new JButton();
 +        }
 +        jb.setText((String) o);
 +        jb.addActionListener(new ActionListener()
 +        {
 +          @Override
 +          public void actionPerformed(ActionEvent e)
 +          {
 +            joptionpane.setValue(buttonAction);
 +            if (action != null)
 +              Executors.newSingleThreadExecutor().submit(action);
 +            // joptionpane.transferFocusBackward();
 +            joptionpane.transferFocusBackward();
 +            joptionpane.setVisible(false);
 +            // put focus and raise parent window if possible, unless cancel
 +            // button pressed
 +            boolean raiseParent = (parentComponent != null);
 +            if (buttonAction == JOptionPane.CANCEL_OPTION)
 +              raiseParent = false;
 +            if (optionType == JOptionPane.YES_NO_OPTION
 +                    && buttonAction == JOptionPane.NO_OPTION)
 +              raiseParent = false;
 +            if (raiseParent)
 +            {
 +              parentComponent.requestFocus();
 +              if (parentComponent instanceof JInternalFrame)
 +              {
 +                JInternalFrame jif = (JInternalFrame) parentComponent;
 +                jif.show();
 +                jif.moveToFront();
 +                jif.grabFocus();
 +              }
 +              else if (parentComponent instanceof Window)
 +              {
 +                Window w = (Window) parentComponent;
 +                w.toFront();
 +                w.requestFocus();
 +              }
 +            }
 +            joptionpane.setVisible(false);
 +          }
 +        });
 +        optionsButtons[i] = jb;
 +        if (o.equals(initialValue))
 +          initialValueButton = jb;
 +      }
      }
 +    joptionpane.setMessage(message);
 +    joptionpane.setMessageType(messageType);
 +    joptionpane.setOptionType(optionType);
 +    joptionpane.setIcon(icon);
 +    joptionpane.setOptions(Platform.isJS() ? options : optionsButtons);
 +    joptionpane.setInitialValue(
 +            Platform.isJS() ? initialValue : initialValueButton);
 +
 +    JDialog dialog = joptionpane.createDialog(parentComponent, title);
-     dialog.setIconImage(WindowIcons.logoIcon.getImage());
++    dialog.setIconImage(null);
 +    dialog.setModalityType(
 +            modal ? ModalityType.APPLICATION_MODAL : ModalityType.MODELESS);
 +    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
 +    return dialog;
 +  }
 +
 +  /**
 +   * Utility to programmatically click a button on a JOptionPane (as a JFrame)
 +   * 
 +   * returns true if button was found
 +   */
 +  public static boolean clickButton(JFrame frame, int buttonType)
 +  {
 +
 +    return false;
    }
  
    /**