package demo.view.hierarchy;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.EventQueue;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;

import y.view.EditMode;
import y.view.MoveSelectionMode;

/**
 * Shows how to use alternative modifiers for ViewMode mouse gestures.
 * <br/>
 * As an example, the behavior of class {@link y.view.MoveSelectionMode}
 * is customized so that alternative modifiers are used for moving selected nodes
 * into and out of group nodes (i.e., re-group them).
 * Instead of the default modifier (SHIFT), the combination ALT-M is set.
 */
public class AlternativeModifiersDemo27 extends HierarchyDemo {
  protected EditMode mode;
  protected MoveSelectionMode myMSM, defaultMSM;
  protected boolean keyMPressed;

  /** Creates a new instance of AlternativeModifiersDemo27. */
  public AlternativeModifiersDemo27() {
    myMSM = new MoveSelectionMode() {
      protected boolean isModifierPressed(MouseEvent me) {
        return keyMPressed && ((me.getModifiersEx() & InputEvent.ALT_DOWN_MASK) != 0);
      }
    };
    // Install the key listener permanently.
    view.getCanvasComponent().addKeyListener(new KeyListener() {
      public void keyPressed(KeyEvent e) {
        keyMPressed = (e.getKeyCode() == KeyEvent.VK_M);
      }
      public void keyTyped(KeyEvent e) {}
      public void keyReleased(KeyEvent e) {}
    });
  }

  protected JToolBar createToolBar() {
    JToolBar bar = super.createToolBar();
    bar.addSeparator();
    final JToggleButton modiferKeysButton = new JToggleButton("Use alternative modifiers");
    modiferKeysButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        mode.setMoveSelectionMode(modiferKeysButton.isSelected() ? myMSM : defaultMSM);
      }
    });
    bar.add(modiferKeysButton);

    return bar;
  }

  protected void registerViewModes() {
    mode = new EditMode();
    defaultMSM = (MoveSelectionMode)mode.getMoveSelectionMode();
    mode.setPopupMode(new HierarchicPopupMode());
    view.addViewMode(mode);
  }

  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      public void run() {
        initLnF();
        new AlternativeModifiersDemo27().start("Alternative Modifier Keys Demo");
      }
    });
  }
}

