Newer
Older
AlgebraicDataflowArchitectureModel / AlgebraicDataflowArchitectureModel / src / application / actions / ChangeCallOrderAction.java
package application.actions;

import java.awt.event.ActionEvent;

import javax.swing.JOptionPane;

import com.mxgraph.model.mxCell;
import com.mxgraph.swing.mxGraphComponent;

import models.controlFlowModel.CallEdgeAttribute;

/*************************************************************
 *
 */
public class ChangeCallOrderAction extends AbstractPopupAction {
	
	/*************************************************************
	 *  [ *constructor ]
	/*************************************************************
	 */
	public ChangeCallOrderAction(final mxGraphComponent graphComponent ,final mxCell cell) {
		super(/*propName*/"changeCallOrder", cell, graphComponent);
	}

	/*************************************************************
	 *  [ *public ]
	/*************************************************************
	 * 
	 */
	@Override
	public void actionPerformed(ActionEvent e) {
		if(targetCell == null) return;
		changeCallOrderOfCallEdge(targetCell);
	}
	
	/*************************************************************
	 * [ *private ]
	/*************************************************************
	 */
	private void changeCallOrderOfCallEdge(Object cellObj) {		
		String input = "";
		int inputOrder = 0;

		CallEdgeAttribute callEdgeAttr = (CallEdgeAttribute)graphComponent.getGraph().getModel().getValue(cellObj);	
		if(callEdgeAttr == null) return;

		input = JOptionPane.showInputDialog("Call order");
		if( input == null) return;

		if( !isNumeric(input) ) {
			JOptionPane.showMessageDialog(graphComponent, "Input value must type of number.");
			return;
		}

		inputOrder = Integer.parseInt(input);

		final int endOfOrderOfSrc = callEdgeAttr.getSourceObjectNode().getOutdegree();
		if(inputOrder <= 0	|| endOfOrderOfSrc < inputOrder) {
			JOptionPane.showMessageDialog(graphComponent, "Input order must be between 1 and " + endOfOrderOfSrc + ".");
			return;
		}

		int curOrder = callEdgeAttr.getSourceObjectNode().getOutEdgeCallOrder(callEdgeAttr.getCallEdge());
		callEdgeAttr.getSourceObjectNode().sortOutEdgesByCallOrder(curOrder,  inputOrder);					

		graphComponent.refresh();
	}

	/*************************************************************
	 * 
	 */
	private boolean isNumeric(final String str) {
		if(str == null) return false;
		return str.matches("[0-9.]+");
	}
}