package captor.windowsystem.main.locationPane;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import captor.domainsystem.DomainSystem;
import captor.domainsystem.FormType;
import captor.domainsystem.NextFormType;
import captor.domainsystem.NextFormsType;
import captor.lib.def.Constant;
import captor.lib.intl.MyIntl;
import captor.modelsystem.Model;
import captor.modelsystem.Project;
import captor.windowsystem.main.locationPane.util.FormPath;
/**
* @author Kicho
* This class shows the pop-up window when the user click in
* some form in the form navigator panel.
* There are tow kinds os pop-up windows:
*
* - The first is the rootPopUpWindow and the popUpForm
*/
public class FormNavigatorPopup extends MouseAdapter {
JTree tree;
JPopupMenu popupForm, popupRoot;
JMenu formVariant, nextForms, insertAfter, edit, help, move;
JMenuItem menuItem;
FormNavigatorListener historyListener;
private Model model;
private DomainSystem d;
public FormNavigatorPopup(JTree tree, Model model) {
this.tree = tree;
this.model = model;
historyListener = new FormNavigatorListener(model);
d = new DomainSystem(model);
}
public void mouseClicked(java.awt.event.MouseEvent event) {
//the user has clicked in some form node in the tree
//we should to display the form in the body panel and return
if( event.getModifiers() == MouseEvent.BUTTON1_MASK ) {
model.getGui().getGuiControl().setLoadedPattern(true);
return;
}
//set the node selected
if ( event.getModifiers() == MouseEvent.BUTTON3_MASK ) {
TreePath tp = model.getGui().getTree().getPathForLocation(event.getX(), event.getY());
model.getGui().getTree().setSelectionPath(tp);
model.getGui().getGuiControl().setLoadedPattern(true);
}
//the user has clicked in some form node with rigth-click
//we have to show the rigth pop-up window
if ( event.getModifiers() == MouseEvent.BUTTON3_MASK ) {
TreePath tp = tree.getPathForLocation(event.getX(), event.getY());
if ( tp != null )
tree.setSelectionPath(tp);
// DefaultMutableTreeNode lastSelectedComponent = null;
// if ( event.getSource() instanceof DefaultMutableTreeNode )
// lastSelectedComponent = (DefaultMutableTreeNode) event.getSource();
// else
// lastSelectedComponent = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
int pos = 0;
if ( tp != null ) {
pos = tp.getPathCount();
}
if ( pos == 1 ) {
//call pop-up window for root element in the tree ("Forms" node)
makeRootPopup(event.getComponent(),event.getX(), event.getY());
}
else if ( pos >= 2 ) {
// call the pop-up window to forms elements
// this window has a form: load variant, insert after, edit->delete, move-up, move-down and so on)
makePopup(event.getComponent(),event.getX(), event.getY());
}
}
}
//------------------------------------------------------------------------------
private void makeRootPopup(Component component, int x, int y) {
if ( model.getProject() != null ) {
if ( model.getProject().getStatus() != Project.CLOSED ) {
popupRoot = new JPopupMenu();
menuItem = new JMenuItem(Constant.NEW_INTERACTION);
menuItem.addActionListener(historyListener);
popupRoot.add(menuItem);
}
}
else {
popupRoot = null;
}
if ( popupRoot != null ) {
popupRoot.show(component, x, y);
}
}
//------------------------------------------------------------------------------
private void makePopup(Component component, int x, int y) {
DefaultMutableTreeNode lastSelectedComponent = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) lastSelectedComponent.getParent();
Object obj = lastSelectedComponent.getUserObject();
FormPath pp = null;
if ( obj instanceof FormPath)
pp = (FormPath) lastSelectedComponent.getUserObject();
popupForm = new JPopupMenu();
if ( pp != null ) {
//load pattern variant menu
if ( pp.getFormType() != null ) {
formVariant = makeLoadVariantMenu();
if ( formVariant != null ) {
if ( formVariant.getItemCount() <= 0 )
formVariant.setEnabled(false);
popupForm.add(formVariant);
popupForm.addSeparator();
}
}
//insert after menu
insertAfter = makeInsertAfterMenu(pp);
if ( insertAfter != null ) {
if ( insertAfter.getItemCount() <= 0 )
insertAfter.setEnabled(false);
popupForm.add(insertAfter);
}
}
//edit menu
edit = new JMenu(MyIntl.NAVIGATOR_POPUP_EDIT);
menuItem = new JMenuItem(MyIntl.NAVIGATOR_POPUP_DELETE);
menuItem.addActionListener(historyListener);
menuItem.setActionCommand(Constant.DELETE_NODE + ":");
edit.add(menuItem);
if ( pp != null ) {
popupForm.addSeparator();
}
popupForm.add(edit);
move = new JMenu(MyIntl.NAVIGATOR_POPUP_MOVE);
move.setEnabled(false);
if ( pp != null ) {
if ( parent.getChildCount() > 1 ) {
move.setEnabled(true);
menuItem = new JMenuItem(MyIntl.NAVIGATOR_POPUP_MOVEUP);
menuItem.addActionListener(historyListener);
menuItem.setActionCommand(Constant.UP_NODE + ":");
move.add(menuItem);
if ( parent.getIndex(lastSelectedComponent) == 0 )
menuItem.setEnabled(false);
menuItem = new JMenuItem(MyIntl.NAVIGATOR_POPUP_MOVEDOWN);
menuItem.addActionListener(historyListener);
menuItem.setActionCommand(Constant.DOWN_NODE + ":");
move.add(menuItem);
if ( (parent.getIndex(lastSelectedComponent) + 1) == parent.getChildCount() )
menuItem.setEnabled(false);
}
}
popupForm.add(move);
if ( pp != null ) {
menuItem = new JMenuItem(MyIntl.NAVIGATOR_POPUP_HELP);
menuItem.addActionListener(historyListener);
menuItem.setActionCommand(Constant.HELP_NODE + ":");
popupForm.addSeparator();
popupForm.add(menuItem);
}
popupForm.show(component, x, y);
}
//------------------------------------------------------------------------------
private JMenu makeInsertAfterMenu(FormPath pp) {
JMenu ia = new JMenu(MyIntl.NAVIGATOR_POPUP_INSERT_AFTER);
boolean hasChild = false;
Vector nextPatternsId = new Vector();
//Criar um vetor com o id dos proximos padroes desse no
NextFormsType npst = pp.getFormType().getNextForms();
if ( npst != null ) {
List l = npst.getNextForm();
for(Iterator it1 = l.iterator(); it1.hasNext();) {
Object obj = it1.next();
NextFormType npt = (NextFormType) obj;
String patternId = npt.getId();
nextPatternsId.add(patternId);
}
}
//inserir os proximos padr�es no menu
Vector nextPatternNames = new Vector();
Vector nextPatternIds = new Vector();
for ( int i = 0; i < nextPatternsId.size(); i++ ) {
String id = (String) nextPatternsId.get(i);
String pname = d.getFormById(id).getName();
nextPatternNames.add(pname);
nextPatternIds.add(id);
}
for ( int i = 0; i < nextPatternNames.size(); i++ ) {
menuItem = new JMenuItem((String) nextPatternNames.get(i));
menuItem.addActionListener(historyListener);
menuItem.setActionCommand(Constant.INSERT_FORM_AFTER + ":" + (String) nextPatternIds.get(i));
ia.add(menuItem);
hasChild = true;
}
if ( !hasChild )
ia.setEnabled(false);
return ia;
}
//------------------------------------------------------------------------------
private JMenu makeLoadVariantMenu(){
DefaultMutableTreeNode lastSelectedComponent = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
FormPath pp = (FormPath) lastSelectedComponent.getUserObject();
formVariant = new JMenu(MyIntl.NAVIGATOR_POPUP_LOAD);
FormType pt = pp.getFormType();
if ( pt != null ) {
Vector patternVariants = d.getVariantByForm(pt.getName());
for ( int i = 0; i < patternVariants.size(); i++ ) {
FormType ptv = (FormType) patternVariants.get(i);
menuItem = new JMenuItem(MyIntl.NAVIGATOR_POPUP_LOAD_VARIANT + ": " + ptv.getVariant());
menuItem.addActionListener(historyListener);
menuItem.setActionCommand(Constant.LOAD_FORM + ":" + ptv.getId());
if ( !ptv.isEnabled() )
menuItem.setEnabled(false);
if ( ptv.getId().equals(pt.getId()) )
menuItem.setEnabled(false);
formVariant.add(menuItem);
}
}
return formVariant;
}
//------------------------------------------------------------------------------
}