Package ui

Source Code of ui.PnlLayers

package ui;

import classes.Layer;
import classes.Project;
import classes.ProjectElement;
import enums.TrafficDefinitionLayerType;
import helpers.Broadcaster;
import interfaces.CurrentLayerChangedListener;
import interfaces.ProjectChangedListener;
import java.awt.BorderLayout;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToolBar;
import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.ExpandVetoException;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
import roadnetwork.RoadNetwork;
import trafficdefinition.TrafficDefinitionLayer;
import ui.controls.JTrafficLayerTree;
import ui.controls.JTrafficLayerTreeModel;
import ui.controls.ProjectTreeCellRenderer;

/**
* Panel used to display and modify the current project's layer collection
*/
public class PnlLayers extends JPanel implements TreeSelectionListener, ProjectChangedListener, TreeWillExpandListener {

  private static final long serialVersionUID = 1L;

  private JButton btnDelete = null;

  private JButton btnDuplicate = null;

  private JButton btnNew = null;

  /**
   * Collection of objects that will be notified when the user selects another
   * layer
   */
  private List<CurrentLayerChangedListener> currentLayerChangedListeners = new ArrayList<CurrentLayerChangedListener>(); // @jve:decl-index=0:

  /**
   * Currently loaded project
   */
  private Project project = null;

  private JScrollPane scrlLayerList = null;

  private JToolBar tlbLayers = null;

  private JTrafficLayerTree treeLayers = null;

  /**
   * This is the default constructor
   */
  public PnlLayers() {
    super();
    initialize();

    // Be informed when the loaded project is changed
    Broadcaster.addProjectChangedListener(this);

    treeLayers.addTreeWillExpandListener(this);
  }

  /**
   * Registers the specified listener so that it will be notified when the
   * current layer changes
   *
   * @param currentLayerChangedListener
   */
  public void addCurrentLayerChangedListener(CurrentLayerChangedListener currentLayerChangedListener) {
    currentLayerChangedListeners.add(currentLayerChangedListener);
  }

  /**
   * Notifies the registered listeners that the current layer has changed
   *
   * @param currentLayer
   */
  public void NotifyCurrentLayerChanged(Layer<? extends ProjectElement> currentLayer) {
    for (CurrentLayerChangedListener currentLayerChangedListener : currentLayerChangedListeners) {
      currentLayerChangedListener.CurrentLayerChanged(currentLayer);
    }
  }

  /**
   * Called when the project is closed, opened or created
   */
  public void ProjectChanged(Project p) {
    project = p;

    // If the project was closed reset the component
    if (project == null) {
      treeLayers.removeTreeSelectionListener(this);

      treeLayers.setModel(new DefaultTreeModel(new DefaultMutableTreeNode("No project loaded")));
      treeLayers.updateUI();

      btnDelete.setEnabled(false);
      btnDuplicate.setEnabled(false);
      btnNew.setEnabled(false);
    }
    // Project opened or created
    else {
      // Create the tree nodes
      DefaultMutableTreeNode root = new DefaultMutableTreeNode("Project");
      DefaultMutableTreeNode mapNode = new DefaultMutableTreeNode(project.getRoadNetwork());
      DefaultMutableTreeNode layersNode = new DefaultMutableTreeNode("Traffic Layers");

      root.add(mapNode);

      for (TrafficDefinitionLayer layer : project.getTrafficLayers()) {
        DefaultMutableTreeNode layerNode = new DefaultMutableTreeNode(layer);

        layersNode.add(layerNode);
      }

      root.add(layersNode);

      JTrafficLayerTreeModel dtm = new JTrafficLayerTreeModel(root);

      treeLayers.setModel(dtm);

      // Select the map node initially
      DefaultMutableTreeNode initialSelection = mapNode;

      TreePath initialSelectionPath = new TreePath(((DefaultTreeModel) treeLayers.getModel()).getPathToRoot(initialSelection));

      treeLayers.addTreeSelectionListener(this);

      treeLayers.setSelectionPath(initialSelectionPath);
    }
  }

  /**
   *
   * @param currentLayerChangedListener
   */
  public void removeCurrentLayerChangedListener(CurrentLayerChangedListener currentLayerChangedListener) {
    if (currentLayerChangedListeners.contains(currentLayerChangedListener)) {
      currentLayerChangedListeners.remove(currentLayerChangedListener);
    }
  }

  public void treeWillCollapse(TreeExpansionEvent e) throws ExpandVetoException {
    //Dont let the user collapse the tree
    throw new ExpandVetoException(e);
  }

  public void treeWillExpand(TreeExpansionEvent e) throws ExpandVetoException {
  }

  /**
   * Called when the user selects a layer in the tree
   */
  public void valueChanged(javax.swing.event.TreeSelectionEvent e) {
    //Get the selected object
    Object newObject = ((DefaultMutableTreeNode) e.getNewLeadSelectionPath().getLastPathComponent()).getUserObject();

    // If the user has selected a traffic layer
    if (newObject instanceof TrafficDefinitionLayer) {
      // Inform the listeners that the current layer has changed
      NotifyCurrentLayerChanged((TrafficDefinitionLayer) newObject);

      // Enable buttons
      btnDelete.setEnabled(true);
      btnNew.setEnabled(true);
      btnDuplicate.setEnabled(true);
    }
    // If the user selected the map
    else if (newObject instanceof RoadNetwork) {
      // Inform the listeners that the current layer has changed
      NotifyCurrentLayerChanged((RoadNetwork) newObject);

      // Disable buttons
      btnDelete.setEnabled(false);
      btnNew.setEnabled(false);
      btnDuplicate.setEnabled(false);
    }
    // If the root or the layers node was selected
    else if (newObject instanceof String) {
      String o = (String) newObject;

      // If the user selected the root node then select the previously
      // selected node (i.e. don't let the user select the root node
      if (o.equals("Project")) {
        treeLayers.setSelectionPath(e.getOldLeadSelectionPath());

        return;
      }
      // If the user selected the layers node then select the first
      // layer
      else if (o.equals("Traffic Layers")) {
        TreePath tp = e.getNewLeadSelectionPath();

        DefaultMutableTreeNode firstLayerNode = ((DefaultMutableTreeNode) tp.getLastPathComponent()).getFirstLeaf();

        TreePath selectionPath = new TreePath(((DefaultTreeModel) treeLayers.getModel()).getPathToRoot(firstLayerNode));

        treeLayers.setSelectionPath(selectionPath);
      }
    }
  }

  /**
   * This method initializes btnDelete
   * @return  javax.swing.JButton
   * @uml.property  name="btnDelete"
   */
  private JButton getBtnDelete() {
    if (btnDelete == null) {
      btnDelete = new JButton();
      btnDelete.setIcon(new ImageIcon(getClass().getResource("/resources/icons/deletelayer.png")));
      btnDelete.setToolTipText("Delete layer");
      btnDelete.setEnabled(false);
      btnDelete.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent e) {
          DeleteCurrentTrafficLayer();
        }
      });
    }
    return btnDelete;
  }

  /**
   * This method initializes btnDuplicate
   * @return  javax.swing.JButton
   * @uml.property  name="btnDuplicate"
   */
  private JButton getBtnDuplicate() {
    if (btnDuplicate == null) {
      btnDuplicate = new JButton();
      btnDuplicate.setEnabled(false);
      btnDuplicate.setIcon(new ImageIcon(getClass().getResource("/resources/icons/duplicatelayer.png")));
      btnDuplicate.setToolTipText("Duplicate layer");
      btnDuplicate.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent e) {
          DuplicateCurrentTrafficLayer();
        }
      });
    }
    return btnDuplicate;
  }

  /**
   * This method initializes btnNew
   * @return  javax.swing.JButton
   * @uml.property  name="btnNew"
   */
  private JButton getBtnNew() {
    if (btnNew == null) {
      btnNew = new JButton();
      btnNew.setIcon(new ImageIcon(getClass().getResource("/resources/icons/addlayer.png")));
      btnNew.setToolTipText("Add new layer");
      btnNew.setSize(new Dimension(28, 20));
      btnNew.setEnabled(false);
      btnNew.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent e) {
          CreateNewTrafficLayer(null);
        }
      });
    }
    return btnNew;
  }

  /**
   * This method initializes scrlLayerList
   * @return  javax.swing.JScrollPane
   * @uml.property  name="scrlLayerList"
   */
  private JScrollPane getScrlLayerList() {
    if (scrlLayerList == null) {
      scrlLayerList = new JScrollPane();
      scrlLayerList.setPreferredSize(new Dimension(100, 100));
      scrlLayerList.setViewportView(getTreeLayers());
    }
    return scrlLayerList;
  }

  /**
   * This method initializes tlbLayers
   * @return  javax.swing.JToolBar
   * @uml.property  name="tlbLayers"
   */
  private JToolBar getTlbLayers() {
    if (tlbLayers == null) {
      tlbLayers = new JToolBar();
      tlbLayers.setSize(new Dimension(211, 30));
      tlbLayers.setFloatable(false);
      tlbLayers.setPreferredSize(new Dimension(18, 26));
      tlbLayers.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
      tlbLayers.add(getBtnNew());
      tlbLayers.add(getBtnDelete());
      tlbLayers.add(getBtnDuplicate());
    }
    return tlbLayers;
  }

  /**
   * This method initializes treeLayers
   * @return  javax.swing.JTree
   * @uml.property  name="treeLayers"
   */
  private JTree getTreeLayers() {
    if (treeLayers == null) {
      treeLayers = new JTrafficLayerTree();
      treeLayers.setShowsRootHandles(false);
      treeLayers.setToggleClickCount(-1);
      treeLayers.setModel(new DefaultTreeModel(new DefaultMutableTreeNode("No project loaded")));
      treeLayers.setEditable(true);
      treeLayers.setCellRenderer(new ProjectTreeCellRenderer());
      treeLayers.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    }
    return treeLayers;
  }

  /**
   * This method initializes this
   *
   */
  private void initialize() {
    this.setSize(162, 200);
    this.setLayout(new BorderLayout());
    this.add(getScrlLayerList(), BorderLayout.CENTER);
    this.add(getTlbLayers(), BorderLayout.SOUTH);

  }

  /**
   * Creates a new traffic layer
   *
   * @param type The new layer's type
   */
  protected void CreateNewTrafficLayer(TrafficDefinitionLayerType type) {
    //If the type was not specified then ask the user
    if(type==null){
      String s = (String) JOptionPane.showInputDialog(this,
                              "Select the type of the new layer",
                              "Create new traffic definition layer",
                              JOptionPane.INFORMATION_MESSAGE,
                              (Icon)new ImageIcon(getClass().getResource("/resources/icons/addlayer.png")),
                              new String[]{"User-defined","Activity-based","Random"},
                              "User-Defined"
                              );
     
      if ((s != null) && (s.length() > 0)) {
        if(s.equals("User-defined")){
          type = TrafficDefinitionLayerType.UserDefined;
        }
        else if(s.equals("Activity-based")){
          type = TrafficDefinitionLayerType.ActivityBased;
        }
        else if(s.equals("Random")){
          type = TrafficDefinitionLayerType.Random;
        }
      }
      else{
        return;
      }
    }
   
    //Create the layer
    TrafficDefinitionLayer newLayer = project.createNewLayer(type);

    //Add the node to the tree
    DefaultMutableTreeNode newLayerNode = new DefaultMutableTreeNode(newLayer);

    DefaultMutableTreeNode layersNode = (DefaultMutableTreeNode) ((DefaultMutableTreeNode) treeLayers.getModel().getRoot()).getChildAt(1);

    layersNode.add(newLayerNode);

    //Select the new layer
    treeLayers.setSelectionPath(new TreePath(newLayerNode.getPath()));

    treeLayers.updateUI();
  }

  /**
   * Deletes the currently selected traffic layer
   *
   */
  protected void DeleteCurrentTrafficLayer() {
    //Get the selected traffic layer
    DefaultMutableTreeNode selectedLayerNode = (DefaultMutableTreeNode) treeLayers.getSelectionPath().getLastPathComponent();
    TrafficDefinitionLayer selectedLayer = (TrafficDefinitionLayer) selectedLayerNode.getUserObject();

    if (JOptionPane.showConfirmDialog(this, "Delete layer " + selectedLayer.getName() + " ?") == JOptionPane.YES_OPTION) {
      // Delete the layer
      project.DeleteLayer((TrafficDefinitionLayer) selectedLayerNode.getUserObject());

      // If this was the last traffic layer add a new layer to the project
      if (selectedLayerNode.getSiblingCount() == 1) {
        JOptionPane.showMessageDialog(this, "The project must have at least one traffic layer. An empty layer will be inserted to the project.");

        CreateNewTrafficLayer(TrafficDefinitionLayerType.UserDefined);
      }

      // Remove the layer node from the tree
      DefaultMutableTreeNode layersNode = (DefaultMutableTreeNode) ((DefaultMutableTreeNode) treeLayers.getModel().getRoot()).getChildAt(1);

      layersNode.remove(selectedLayerNode);

      // Select the first layer
      treeLayers.setSelectionPath(new TreePath(((DefaultMutableTreeNode) layersNode.getFirstChild()).getPath()));

      treeLayers.updateUI();
    }
  }

  /**
   * Creates a new traffic layer that is a copy of the currently selected one
   *
   */
  protected void DuplicateCurrentTrafficLayer() {
    DefaultMutableTreeNode selectedLayerNode = (DefaultMutableTreeNode) treeLayers.getSelectionPath().getLastPathComponent();

    TrafficDefinitionLayer newLayer = project.createDuplicateLayer((TrafficDefinitionLayer) selectedLayerNode.getUserObject());

    DefaultMutableTreeNode newLayerNode = new DefaultMutableTreeNode(newLayer);

    DefaultMutableTreeNode layersNode = (DefaultMutableTreeNode) ((DefaultMutableTreeNode) treeLayers.getModel().getRoot()).getChildAt(1);

    layersNode.add(newLayerNode);

    treeLayers.setSelectionPath(new TreePath(newLayerNode.getPath()));

    treeLayers.updateUI();
  }

} // @jve:decl-index=0:visual-constraint="10,10"
TOP

Related Classes of ui.PnlLayers

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.