Package com.cedarsoft.presenter.demo

Source Code of com.cedarsoft.presenter.demo.MenuDemo$EditFileAction

package com.cedarsoft.presenter.demo;

import com.cedarsoft.commons.struct.DefaultNode;
import com.cedarsoft.commons.struct.Node;
import com.cedarsoft.lookup.DynamicLookup;
import com.cedarsoft.lookup.Lookups;
import com.cedarsoft.presenter.AbstractButtonPresenter;
import com.cedarsoft.presenter.JMenuBarPresenter;
import com.cedarsoft.presenter.JMenuPresenter;
import com.cedarsoft.presenter.demo.graph.NodePresenter;
import org.jetbrains.annotations.NotNull;
import y.view.Graph2D;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JSeparator;
import java.awt.Color;
import java.awt.event.ActionEvent;

/**
* Demonstrates the building of a demo
*/
public class MenuDemo {
  private AbstractAction addAction;

  public static void main( String[] args ) {
    new MenuDemo().run();
  }

  protected final Node rootNode;

  public MenuDemo() {
    rootNode = new DefaultNode( "menuNode" );
    final DefaultNode fileMenuNode = new DefaultNode( "file", Lookups.singletonLookup( Action.class, new FileAction() ) );
    rootNode.addChild( fileMenuNode );

    fileMenuNode.addChild( new DefaultNode( "open", Lookups.singletonLookup( Action.class, new OpenAction() ) ) );
    fileMenuNode.addChild( new DefaultNode( "close", Lookups.singletonLookup( Action.class, new CloseAction() ) ) );

    fileMenuNode.addChild( new DefaultNode( "increate counter", Lookups.singletonLookup( Action.class, new CounterAction() ) ) );


    DefaultNode recentlyOpenedFilesNode = new DefaultNode( "recentlyOpenedFiles", Lookups.singletonLookup( Action.class, new RecentFilesAction() ) );
    fileMenuNode.addChild( recentlyOpenedFilesNode );

    recentlyOpenedFilesNode.addChild( new DefaultNode( "file0", Lookups.singletonLookup( Action.class, new RecentFileAction( "file0" ) ) ) );
    recentlyOpenedFilesNode.addChild( new DefaultNode( "file1", Lookups.singletonLookup( Action.class, new RecentFileAction( "file1" ) ) ) );
    recentlyOpenedFilesNode.addChild( new DefaultNode( "file2", Lookups.singletonLookup( Action.class, new RecentFileAction( "file2" ) ) ) );
    recentlyOpenedFilesNode.addChild( new DefaultNode( "file3", Lookups.dynamicLookup( new RecentFileAction( "file3" ), new NodePresenter() {
      @Override
      @NotNull
      protected y.base.Node createPresentation() {
        y.base.Node node = super.createPresentation();
        ( ( Graph2D ) node.getGraph() ).getRealizer( node ).setFillColor( Color.CYAN );
        return node;
      }
    } ) ) );

    fileMenuNode.addChild( new DefaultNode( "separator", Lookups.dynamicLookup( new JSeparator() ) ) );

    {
      final DynamicLookup lookup = new DynamicLookup();
      final AbstractAction[] actions = new AbstractAction[2];

      actions[0] = new AbstractAction( "action0" ) {
        public void actionPerformed( ActionEvent e ) {
          lookup.addValue( actions[1] );
        }
      };

      actions[1] = new AbstractAction( "action1" ) {
        public void actionPerformed( ActionEvent e ) {
          lookup.addValue( actions[0] );
        }
      };

      lookup.addValue( actions[0] );
      fileMenuNode.addChild( new DefaultNode( "toggleAction", lookup ) );
    }

    fileMenuNode.addChild( new DefaultNode( "separator1", Lookups.dynamicLookup( new JSeparator() ) ) );

    addAction = new AbstractAction( "Add Another Item" ) {
      public void actionPerformed( ActionEvent e ) {
        fileMenuNode.addChild( new DefaultNode( String.valueOf( System.currentTimeMillis() ), Lookups.singletonLookup( Action.class, addAction ) ) );
      }
    };
    fileMenuNode.addChild( new DefaultNode( "addAction", Lookups.singletonLookup( Action.class, addAction ) ) );


    rootNode.addChild( new DefaultNode( "customEditMenu", Lookups.dynamicLookup( new EditFileAction(), new MySpecialEditMenuPresenter() ) ) );
  }

  protected void run() {
    JMenuBarPresenter presenter = new JMenuBarPresenter();
    JFrame frame = createFrame();
    frame.setJMenuBar( presenter.present( rootNode ) );
    frame.setVisible( true );
  }

  @NotNull
  protected JFrame createFrame() {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );


    frame.pack();
    frame.setSize( 800, 600 );
    frame.setLocationRelativeTo( null );
    return frame;
  }

  static final class RecentFileAction extends AbstractAction {
    private RecentFileAction( String name ) {
      super( name );
    }

    public void actionPerformed( ActionEvent e ) {
      System.out.println( "Clicked on recent file " + getValue( Action.NAME ) );
    }
  }

  static class MySpecialEditMenuPresenter extends AbstractButtonPresenter<JMenu> implements JMenuPresenter {
    @Override
    @NotNull
    public JMenu createPresentation() {
      JMenu theMenu = new JMenu();
      theMenu.add( new JMenuItem( "manually added" ) );
      theMenu.add( new JMenuItem( "manually added 2" ) );
      return theMenu;
    }

    protected boolean shallAddChildren() {
      return false;
    }
  }

  private static class FileAction extends AbstractAction {
    public FileAction() {
      super( "File" );
    }

    public void actionPerformed( ActionEvent e ) {
      throw new UnsupportedOperationException();
    }
  }

  private static class OpenAction extends AbstractAction {
    public OpenAction() {
      super( "Open" );
    }

    public void actionPerformed( ActionEvent e ) {
      System.out.println( "Opening file" );
    }
  }

  private static class CloseAction extends AbstractAction {
    public CloseAction() {
      super( "Close" );
    }

    public void actionPerformed( ActionEvent e ) {
      System.out.println( "Closing file" );
    }
  }

  private static class CounterAction extends AbstractAction {
    private int counter;

    {
      updateName();
    }

    private void updateName() {
      this.putValue( Action.NAME, "Counter: " + counter );
    }

    public void actionPerformed( ActionEvent e ) {
      counter++;
      updateName();
    }
  }

  private static class RecentFilesAction extends AbstractAction {
    public RecentFilesAction() {
      super( "Recent Files" );
    }

    public void actionPerformed( ActionEvent e ) {
      throw new UnsupportedOperationException();
    }
  }

  private static class EditFileAction extends AbstractAction {
    public EditFileAction() {
      super( "Edit" );
    }

    public void actionPerformed( ActionEvent e ) {
      throw new UnsupportedOperationException();
    }
  }
}
TOP

Related Classes of com.cedarsoft.presenter.demo.MenuDemo$EditFileAction

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.