Package org.freeplane.view.swing.map.attribute

Source Code of org.freeplane.view.swing.map.attribute.AttributePopupMenu

/*
*  Freeplane - mind map editor
*  Copyright (C) 2008 Dimitry Polivaev
*
*  This file author is Dimitry Polivaev
*
*  This program is free software: you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation, either version 2 of the License, or
*  (at your option) any later version.
*
*  This program is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
package org.freeplane.view.swing.map.attribute;

import java.awt.Component;
import java.awt.EventQueue;
import java.awt.KeyboardFocusManager;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.net.URI;
import java.net.URISyntaxException;

import javax.swing.JComponent;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.table.JTableHeader;

import org.freeplane.core.ui.components.UITools;
import org.freeplane.core.util.LogUtils;
import org.freeplane.core.util.TextUtils;
import org.freeplane.features.attribute.AttributeTableLayoutModel;
import org.freeplane.features.attribute.IAttributeTableModel;
import org.freeplane.features.link.LinkController;
import org.freeplane.features.link.mindmapmode.MLinkController;
import org.freeplane.features.map.NodeModel;
import org.freeplane.features.mode.Controller;
import org.freeplane.features.url.UrlManager;
import org.freeplane.features.url.mindmapmode.MFileManager;
import org.freeplane.view.swing.ui.mindmapmode.INodeSelector;
import org.freeplane.view.swing.ui.mindmapmode.NodeSelector;

/**
* @author Dimitry Polivaev
*/
class AttributePopupMenu extends JPopupMenu implements MouseListener {
  /**
   *
   */
  private static final long serialVersionUID = 1L;
  private JMenuItem delete = null;
  private JMenuItem down = null;
  private JMenuItem insert = null;
  private JMenuItem insertFileLink = null;
  private boolean oldTable;
  private JMenuItem optimalWidth = null;
  private int row;
  private AttributeTable table;
  private JMenuItem up = null;
  private int col;
  private JMenuItem insertLink;
  private JMenuItem insertNodeLink;
  private JMenuItem insertAnchoredLink;

  @Override
  protected void firePopupMenuWillBecomeInvisible() {
    if (row != -1) {
      table.removeRowSelectionInterval(row, row);
    }
    oldTable = true;
    EventQueue.invokeLater(new Runnable() {
      public void run() {
        if (!oldTable) {
          return;
        }
        final KeyboardFocusManager focusManager = java.awt.KeyboardFocusManager
            .getCurrentKeyboardFocusManager();
        final Component focusOwner = SwingUtilities.getAncestorOfClass(AttributeTable.class, focusManager
            .getFocusOwner());
        if (table != focusOwner && focusOwner instanceof JComponent) {
          table.requestFocus(true);
          ((JComponent) focusOwner).requestFocusInWindow();
        }
        table = null;
      }
    });
  }

  @Override
  protected void firePopupMenuWillBecomeVisible() {
    super.firePopupMenuWillBecomeVisible();
    if (row != -1) {
      table.addRowSelectionInterval(row, row);
    }
  }

  /**
   * @return Returns the delete.
   */
  private JMenuItem getDelete() {
    if (delete == null) {
      delete = new JMenuItem(TextUtils.getText("attributes_popup_delete"));
      delete.addActionListener(new ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          table.removeRow(row);
        }
      });
    }
    return delete;
  }

  /**
   * @return Returns the down.
   */
  private JMenuItem getDown() {
    if (down == null) {
      down = new JMenuItem(TextUtils.getText("attributes_popup_down"));
      down.addActionListener(new ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          table.moveRowDown(row);
        }
      });
    }
    return down;
  }

  /**
   * @return Returns the insert.
   */
  private JMenuItem getInsert() {
    if (insert == null) {
      insert = new JMenuItem(TextUtils.getText("attributes_popup_new"));
      insert.addActionListener(new ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          table.insertRow(row + 1);
        }
      });
    }
    return insert;
  }
  /**
   * @return Returns the insert.
   */
  private JMenuItem getInsertFileLink() {
    if (insertFileLink == null) {
      insertFileLink = new JMenuItem(TextUtils.getText("SetLinkByFileChooserAction.text"));
      insertFileLink.addActionListener(new ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          final AttributeTable table = AttributePopupMenu.this.table;
          final URI relative = ((MFileManager) UrlManager.getController())
            .getLinkByFileChooser(Controller.getCurrentController().getMap());
          if (relative != null) {
            table.setValueAt(relative, row, col);
          }
        }
      });
    }
    return insertFileLink;
  }
  /**
   * @return Returns the insert.
   */
  private JMenuItem getInsertLink() {
    if (insertLink == null) {
      insertLink = new JMenuItem(TextUtils.getText("SetLinkByTextFieldAction.text"));
      insertLink.addActionListener(new ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          final AttributeTable table = AttributePopupMenu.this.table;
          final Object oldValue = table.getValueAt(row, col);
          final String inputValue = JOptionPane.showInputDialog(table, TextUtils.getText("edit_link_manually"), oldValue.toString());
          if (inputValue != null && (oldValue instanceof String || ! oldValue.equals(inputValue))) {
            if (inputValue.toString().equals("")) {
              table.setValueAt("", row, col);
            }
            try {
              final URI link = LinkController.createURI(inputValue.trim());
              if(! oldValue.equals(link))
                table.setValueAt(link, row, col);
            }
            catch (final URISyntaxException e1) {
              LogUtils.warn(e1);
              UITools.errorMessage(TextUtils.format("invalid_uri", inputValue));
              return;
            }
          }
        }
       
      });
    }
    return insertLink;
  }

  private JMenuItem getInsertNodeLink() {
    if (insertNodeLink == null) {
      insertNodeLink = new JMenuItem(TextUtils.getText("SetNodeLink.text"));
      insertNodeLink.addActionListener(new ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          final AttributeTable table = AttributePopupMenu.this.table;
          final Object oldValue = table.getValueAt(row, col);
          final NodeSelector nodeSelector = new NodeSelector();
          nodeSelector.show(table, new INodeSelector() {
            public void nodeSelected(NodeModel node) {
              if(node == null)
                return;
              final String inputValue = "#" + node.getID();
              try {
                final URI link = LinkController.createURI(inputValue);
                if(! oldValue.equals(link))
                  table.setValueAt(link, row, col);
              }
              catch (final URISyntaxException e1) {
                LogUtils.severe(e1);
                return;
              }
            }
          });
        }

      });
    }
    return insertNodeLink;
  }

  private JMenuItem getInsertAnchoredLink() {
    if (insertAnchoredLink == null) {
      insertAnchoredLink = new JMenuItem(TextUtils.getText("MakeLinkToAnchorAction.text"));
      insertAnchoredLink.addActionListener(new ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          final AttributeTable table = AttributePopupMenu.this.table;
          final Object oldValue = table.getValueAt(row, col);
          final LinkController linkController = LinkController.getController();
          if(linkController instanceof MLinkController) {
                      final MLinkController mLinkController = (MLinkController)linkController;
            if (mLinkController.isAnchored()) {
                            try {
                              final String anchorIDforNode = mLinkController.getAnchorIDforNode(((IAttributeTableModel) table.getModel()).getNode());
                              if(anchorIDforNode != null){
                                URI link = LinkController.createURI(anchorIDforNode);
                                if(! oldValue.equals(link))
                                  table.setValueAt(link, row, col);
                              }
                            }
                            catch (URISyntaxException e1) {
                            }
                      }
                    }
        }

      });
    }
    return insertAnchoredLink;
  }
  /**
   * @return Returns the optimalWidth.
   */
  private JMenuItem getOptimalWidth() {
    if (optimalWidth == null) {
      optimalWidth = new JMenuItem(TextUtils.getText("attributes_popup_optimal_width"));
      optimalWidth.addActionListener(new ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          table.setOptimalColumnWidths();
        }
      });
    }
    return optimalWidth;
  }

  public AttributeTable getTable() {
    return table;
  }

  /**
   * @return Returns the up.
   */
  private JMenuItem getUp() {
    if (up == null) {
      up = new JMenuItem(TextUtils.getText("attributes_popup_up"));
      up.addActionListener(new ActionListener() {
        public void actionPerformed(final ActionEvent e) {
          table.moveRowUp(row);
        }
      });
    }
    return up;
  }

  /**
   *
   */
  private void make() {
    final String attributeViewType = table.getAttributeView().getViewType();
    final IAttributeTableModel model = table.getAttributeTableModel();
    final int rowCount = model.getRowCount();
    add(getOptimalWidth());
    if(col == 1){
      add(getInsertLink());
      add(getInsertFileLink());
      add(getInsertNodeLink());
      final LinkController linkController = LinkController.getController();
      if(linkController instanceof MLinkController && ((MLinkController)linkController).isAnchored())
        add(getInsertAnchoredLink());
    }
    if (attributeViewType.equals(AttributeTableLayoutModel.SHOW_ALL)) {
      add(getInsert());
      if (row != -1) {
        add(getDelete());
        if (row != 0) {
          add(getUp());
        }
        if (row != rowCount - 1) {
          add(getDown());
        }
      }
    }
  }

  private void maybeShowPopup(final MouseEvent e) {
    if (e.isPopupTrigger()) {
      selectTable(e.getComponent(), e.getPoint());
      if (table.isEditing()) {
        return;
      }
      table.requestFocusInWindow();
      make();
      show(e.getComponent(), e.getX(), e.getY());
    }
  }

  /*
   * (non-Javadoc)
   * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
   */
  public void mouseClicked(final MouseEvent e) {
  }

  /*
   * (non-Javadoc)
   * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
   */
  public void mouseEntered(final MouseEvent e) {
  }

  /*
   * (non-Javadoc)
   * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
   */
  public void mouseExited(final MouseEvent e) {
  }

  public void mousePressed(final MouseEvent e) {
    maybeShowPopup(e);
  }

  public void mouseReleased(final MouseEvent e) {
    maybeShowPopup(e);
  }

  private void selectTable(final Component component, final Point point) throws AssertionError {
    final int componentCount = getComponentCount();
    for (int i = componentCount; i > 0;) {
      remove(--i);
    }
    if (component instanceof AttributeTable) {
      table = (AttributeTable) component;
      if (table.isEditing()) {
        return;
      }
      oldTable = false;
      row = table.rowAtPoint(point);
      col = table.columnAtPoint(point);
      if (row >= 0) {
        if (table.getValueAt(row, 0).equals("")) {
          row--;
        }
      }
      if (row >= 0) {
        table.changeSelection(row, table.columnAtPoint(point), false, false);
      }
      return;
    }
    if (component instanceof JTableHeader) {
      final JTableHeader header = (JTableHeader) component;
      table = (AttributeTable) header.getTable();
      if (table.isEditing()) {
        return;
      }
      oldTable = false;
      row = -1;
      col = -1;
      return;
    }
    throw new AssertionError();
  }

  @Override
    public void setVisible(boolean visible) {
      super.setVisible(visible);
      if(visible){
        return;
      }
      table.requestFocusInWindow();
    }
 
 
}
TOP

Related Classes of org.freeplane.view.swing.map.attribute.AttributePopupMenu

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.