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 javax.swing.JToggleButton;
import javax.swing.JToolBar;

import y.view.EditMode;
import y.view.hierarchy.HierarchyEditMode;
import y.view.hierarchy.HierarchyMoveSelectionMode;

/**
 * Shows how to use alternative modifiers for ViewMode mouse gestures.
 * <br/>
 * As an example, the behavior of class {@link y.view.hierarchy.HierachyMoveSelectionMode} 
 * 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 AlternativeModifiersDemo extends HierarchyDemo {
  protected EditMode mode;
  protected HierarchyMoveSelectionMode myHMSM, defaultHMSM;
  protected boolean keyMPressed;
  
  /** Creates a new instance of AlternativeModifiersDemo. */
  public AlternativeModifiersDemo() {
    myHMSM = new HierarchyMoveSelectionMode() {
      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() == e.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() ? myHMSM : defaultHMSM);
      }
    });
    bar.add(modiferKeysButton);
    
    return bar;
  }
  
  protected void registerViewModes() {
    mode = new HierarchyEditMode();
    defaultHMSM = (HierarchyMoveSelectionMode)mode.getMoveSelectionMode();
    mode.setPopupMode(new HierarchicPopupMode());
    view.addViewMode(mode);
  }
  
  public static void main(String[] args) {
    initLnF();
    AlternativeModifiersDemo demo = new AlternativeModifiersDemo();
    demo.start("Alternative Modifier Keys Demo");
  }
}

