Package org.eclipse.jst.pagedesigner.actions.link

Source Code of org.eclipse.jst.pagedesigner.actions.link.MakeLinkAction

/*******************************************************************************
* Copyright (c) 2006 Sybase, Inc. and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.actions.link;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.eclipse.gef.EditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.window.Window;
import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonWizardDialog;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.jst.pagedesigner.parts.TextEditPart;
import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
import org.eclipse.jst.pagedesigner.viewer.DesignRange;
import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
* @author mengbo
* @version 1.5
*/
public class MakeLinkAction extends Action {
  private final static String MAKE_LINK = PDPlugin
      .getResourceString("ActionGroup.Submenu.Link"); //$NON-NLS-1$

  private final static String WIZARD_PAGE_TITLE = PDPlugin
      .getResourceString("MakeLinkAction.Wizard.PageTitle"); //$NON-NLS-1$

  private EditPart _editPart;

  private DesignRange _range;

  private String _linkType;

  /**
   * @param range
   */
  public MakeLinkAction(DesignRange range) {
    super(MAKE_LINK);
    _range = range;
    _editPart = convertToEditPart(_range);
  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jface.action.Action#run()
   */
  public void run() {
    Map<String, ILinkCreator> map = calAvailableLinkCreator();
    if (map.size() > 1) {
      CreateLinkWizard wizard = new CreateLinkWizard(_editPart, _range,
          map);
      wizard.setPageTitle(WIZARD_PAGE_TITLE);
      CommonWizardDialog wizardDialog = new CommonWizardDialog(
          getShell(), wizard);
      wizardDialog.create();
      if (wizardDialog.open() == Window.OK) {
        _linkType = wizard.getChosenLinkType();
      }
    }
    // else must be html link
    else if (map.size() == 1) {
      Set<Map.Entry<String, ILinkCreator>> set = map.entrySet();
      Iterator<Map.Entry<String,ILinkCreator>> itr = set.iterator();
      while (itr.hasNext()) {
        ILinkCreator creator =  itr.next().getValue();
        _linkType = creator.getLinkIdentifier();
      }
    }

    if (_linkType != null) {
      Request request = new LinkRequest(_linkType, _range);
      Command cmd = _editPart.getCommand(request);
      if (cmd != null && cmd.canExecute()) {
        cmd.execute();
      }
    }

  }

  /*
   * (non-Javadoc)
   *
   * @see org.eclipse.jface.action.IAction#isEnabled()
   */
  public boolean isEnabled() {
    if (_editPart == null) {
      return false;
    }
    return super.isEnabled();
  }

  private EditPart convertToEditPart(DesignRange range) {
    DesignPosition startPosition = range.getStartPosition();
    EditPart startPart = startPosition.getContainerPart();

    DesignPosition endPosition = range.getEndPosition();
    EditPart endPart = endPosition.getContainerPart();

    if (startPosition == endPosition) {
      return null;
    }

    if (startPart instanceof TextEditPart
        && endPart instanceof TextEditPart) {
      if ((startPart == endPart)) {
        return startPart;
      }
    } else if (!(startPart instanceof TextEditPart)
        && !(endPart instanceof TextEditPart)) {
      Node[] startNodeOptions = null;
      startNodeOptions = getSideNodes(startPosition);
      Node[] endNodeOptions = null;
      endNodeOptions = getSideNodes(endPosition);
      Node selectedNode = null;
      for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
          if (startNodeOptions[i] == endNodeOptions[j]) {
            selectedNode = startNodeOptions[i];
            break;
          }
        }
        if (selectedNode != null) {
          break;
        }
      }
      if (selectedNode != null) {
        EditPart part = (EditPart) ((INodeNotifier) selectedNode)
            .getAdapterFor(EditPart.class);
        return part;
      }
    } else {
      if (startPart instanceof TextEditPart) {
        Node[] endNodeOptions = null;
        endNodeOptions = getSideNodes(endPosition);
        if (startPart.getModel() == endNodeOptions[0]
            || startPart.getModel() == endNodeOptions[1]) {
          return startPart;
        }
      }
      if (endPart instanceof TextEditPart) {
        Node[] startNodeOptions = null;
        startNodeOptions = getSideNodes(startPosition);
        if (endPart.getModel() == startNodeOptions[0]
            || endPart.getModel() == startNodeOptions[1]) {
          return endPart;
        }
      }
    }

    return null;
  }

  private Node[] getSideNodes(DesignPosition pos) {
    Node[] nodes = new Node[2];

    EditPart part = pos.getContainerPart();
    Node node = (Node) part.getModel();
    NodeList list = node.getChildNodes();

    if (list.getLength() == pos.getOffset()) {
      nodes[0] = list.item(pos.getOffset() - 1);
      nodes[1] = list.item(pos.getOffset() - 1);
    } else if (pos.getOffset() == 0) {
      nodes[0] = list.item(0);
      nodes[1] = list.item(0);
    } else if (pos.getOffset() > 0 && pos.getOffset() < list.getLength()) {
      nodes[0] = list.item(pos.getOffset() - 1);
      nodes[1] = list.item(pos.getOffset());
    }

    return nodes;
  }

  private Shell getShell() {
    if (_editPart != null) {
      IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _editPart
          .getViewer();
      return viewer.getControl().getShell();
    }
    return null;
  }

  private Map<String, ILinkCreator> calAvailableLinkCreator() {
    Map<String, ILinkCreator> map = new HashMap<String, ILinkCreator>();
    List<ILinkCreator> linkCreators = ExtensionReader.getAllLinkHandlers();
    for (ILinkCreator linkCreator : linkCreators) {
      String identifier = linkCreator.getLinkIdentifier();
      boolean canExecute = linkCreator.canExecute(_range);
      if (canExecute) {
        map.put(identifier, linkCreator);
      }
    }
    return map;
  }
}
TOP

Related Classes of org.eclipse.jst.pagedesigner.actions.link.MakeLinkAction

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.