Package com.eviware.soapui.support.resolver

Source Code of com.eviware.soapui.support.resolver.ResolveDialog$ResolverRenderer

/*
*  soapUI, copyright (C) 2004-2011 eviware.com
*
*  soapUI is free software; you can redistribute it and/or modify it under the
*  terms of version 2.1 of the GNU Lesser General Public License as published by
*  the Free Software Foundation.
*
*  soapUI 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 Lesser General Public License for more details at gnu.org.
*/

package com.eviware.soapui.support.resolver;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.AbstractCellEditor;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;

import org.jdesktop.swingx.JXTable;

import com.eviware.soapui.impl.wsdl.AbstractWsdlModelItem;
import com.eviware.soapui.impl.wsdl.actions.project.SimpleDialog;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.project.Project;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.resolver.ResolveContext.PathToResolve;
import com.eviware.soapui.support.resolver.ResolveContext.Resolver;

/**
* Utility for resolving items
*
* @author Ole.Matzura
*/

public class ResolveDialog
{

  private JDialog dialog;
  private ResolveContextTableModel resolveContextTableModel;
  private boolean showOkMessage;
  private String title;
  private String description;
  private String helpUrl;
  private JXTable table;

  public ResolveDialog( String title, String description, String helpUrl )
  {
    this.title = title;

    this.description = description;
    this.helpUrl = helpUrl;

  }

  @SuppressWarnings( "serial" )
  private void buildDialog()
  {
    dialog = new SimpleDialog( title, description, helpUrl, true )
    {
      @Override
      protected Component buildContent()
      {
        JPanel panel = new JPanel( new BorderLayout() );
        table = new JXTable( resolveContextTableModel );
        table.setHorizontalScrollEnabled( true );
        table.setDefaultRenderer( JComboBox.class, new ResolverRenderer() );
        table.setDefaultEditor( JComboBox.class, new ResolverEditor() );
        table.getColumn( 2 ).setCellRenderer( new PathCellRenderer() );
        table.getColumn( 3 ).setWidth( 100 );
        table.addMouseListener( new MouseAdapter()
        {
          @Override
          public void mouseClicked( MouseEvent e )
          {
            if( e.getClickCount() > 1 )
            {
              int ix = table.getSelectedRow();
              if( ix != -1 )
              {
                ResolveContext.PathToResolve pathToResolve = resolveContextTableModel.getContext()
                    .getPathsToResolve().get( ix );

                if( pathToResolve != null )
                  UISupport.selectAndShow( pathToResolve.getOwner() );
              }
            }
          }
        } );

        panel.add( new JScrollPane( table ), BorderLayout.CENTER );
        panel.setBorder( BorderFactory.createEmptyBorder( 5, 5, 5, 5 ) );

        return panel;
      }

      /*
       * Change Cancel into Update
       */
      @Override
      protected void modifyButtons()
      {
        super.modifyButtons();
        Component[] components = buttons.getComponents();
        for( Component component : components )
        {
          if( component instanceof JButton )
          {
            JButton button = ( JButton )component;
            if( button.getText().equals( "Cancel" ) )
            {
              button.setText( "Update" );
            }
          }
        }
      }

      @Override
      protected boolean handleCancel()
      {
        return handleUpdate();
      }

      @SuppressWarnings( "unchecked" )
      private boolean handleUpdate()
      {
        for( PathToResolve otherPath : resolveContextTableModel.getContext().getPathsToResolve() )
        {
          if( !otherPath.isResolved() )
          {
            otherPath.getOwner().afterLoad();
            otherPath.getOwner().resolve( resolveContextTableModel.getContext() );
          }
        }

        dialog = null;
        setVisible( false );
        resolve( resolveContextTableModel.getContext().getModelItem() );
        return true;
      }

      @SuppressWarnings( "unchecked" )
      @Override
      protected boolean handleOk()
      {
        for( PathToResolve path : resolveContextTableModel.getContext().getPathsToResolve() )
        {
          if( !path.isResolved() )
          {
            if( UISupport.confirm( "There are unresolved paths, continue?", "Unresolved paths - Warning" ) )
            {
              return true;
            }
            return false;
          }
        }
        return true;
      }

    };

    dialog.setSize( 550, 300 );
    dialog.setModal( false );
    dialog.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
    dialog.addWindowListener( new WindowAdapter()
    {

      @SuppressWarnings( "unchecked" )
      @Override
      public void windowClosing( WindowEvent arg0 )
      {
        for( PathToResolve path : resolveContextTableModel.getContext().getPathsToResolve() )
        {
          if( !path.isResolved() )
          {
            if( UISupport.confirm( "There are unresolved paths, continue?", "Unresolved paths - Warning" ) )
            {
              dialog.setVisible( false );
            }
            break;
          }
        }
      }
    } );

  }

  public boolean isShowOkMessage()
  {
    return showOkMessage;
  }

  public void setShowOkMessage( boolean showOkMessage )
  {
    this.showOkMessage = showOkMessage;
  }

  public ResolveContext<?> resolve( AbstractWsdlModelItem<?> modelItem )
  {
    ResolveContext<?> context = new ResolveContext<AbstractWsdlModelItem<?>>( modelItem );
    modelItem.resolve( context );
    if( context.isEmpty() )
    {
      if( isShowOkMessage() )
      {
        UISupport.showInfoMessage( "No resolve problems found", title );
      }
    }
    else
    {
      resolveContextTableModel = new ResolveContextTableModel( context );
      if( dialog == null )
        buildDialog();
      else
        table.setModel( resolveContextTableModel );

      UISupport.centerDialog( dialog );
      dialog.setVisible( true );
    }

    return context;
  }

  @SuppressWarnings( "serial" )
  private class ResolveContextTableModel extends AbstractTableModel
  {
    private ResolveContext<?> context;
    private ArrayList<JComboBox> jbcList = new ArrayList<JComboBox>();

    @SuppressWarnings( "unchecked" )
    public ResolveContextTableModel( ResolveContext<?> context2 )
    {
      context = context2;
      for( PathToResolve path : context.getPathsToResolve() )
      {
        ArrayList<Object> resolversAndDefaultAction = new ArrayList<Object>();
        resolversAndDefaultAction.add( "Choose one..." );
        for( Object resolver : path.getResolvers() )
        {
          resolversAndDefaultAction.add( resolver );
        }
        JComboBox jbc = new JComboBox( resolversAndDefaultAction.toArray() );
        jbcList.add( jbc );
      }

    }

    public JComboBox getResolversAndActions( int row )
    {
      return jbcList.get( row );
    }

    public int getColumnCount()
    {
      return 4;
    }

    public void setContext( ResolveContext<?> context )
    {
      this.context = context;
      fireTableDataChanged();
    }

    @Override
    public String getColumnName( int column )
    {
      switch( column )
      {
      case 0 :
        return "Item";
      case 1 :
        return "Description";
      case 2 :
        return "Value";
      case 3 :
        return "Action";
      }

      return super.getColumnName( column );
    }

    @Override
    public Class<?> getColumnClass( int arg0 )
    {
      if( arg0 == 3 )
        return JComboBox.class;
      else
        return String.class;
    }

    public int getRowCount()
    {
      return context.getPathsToResolve().size();
    }

    @Override
    public boolean isCellEditable( int rowIndex, int columnIndex )
    {
      return columnIndex == 3;
    }

    @SuppressWarnings( "unchecked" )
    public Object getValueAt( int arg0, int arg1 )
    {
      PathToResolve ptr = context.getPathsToResolve().get( arg0 );
      switch( arg1 )
      {
      case 0 :
        return createItemName( ptr );
      case 1 :
        return ptr.getDescription();
      case 2 :
        return ptr.getPath();

      }

      return null;
    }

    @SuppressWarnings( "unchecked" )
    private String createItemName( PathToResolve ptr )
    {
      String name = "";
      ModelItem modelItem = ptr.getOwner();
      try
      {
        name = modelItem.getName();
      }
      catch( Exception e )
      {
        e.getStackTrace();
      }

      while( modelItem.getParent() != null && !( modelItem.getParent() instanceof Project ) )
      {
        modelItem = modelItem.getParent();
        name = modelItem.getName() + " - " + name;
      }

      return name;
    }

    public ResolveContext<?> getContext()
    {
      return context;
    }

    @SuppressWarnings( "unchecked" )
    public void setResolver( int pathIndex, Object resolveOrDefaultAction )
    {
      PathToResolve path = context.getPathsToResolve().get( pathIndex );
      if( resolveOrDefaultAction instanceof Resolver )
      {
        path.setResolver( resolveOrDefaultAction );
      }

    }
  }

  private class ResolverRenderer implements TableCellRenderer
  {

    public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus,
        int row, int column )
    {
      return ( ( ResolveContextTableModel )table.getModel() ).getResolversAndActions( row );
    }
  }

  @SuppressWarnings( "serial" )
  private class ResolverEditor extends AbstractCellEditor implements TableCellEditor
  {
    private JComboBox jbc = new JComboBox();

    @SuppressWarnings( "unchecked" )
    public Component getTableCellEditorComponent( final JTable table, Object value, boolean isSelected, int row,
        int column )
    {
      jbc = ( ( ResolveContextTableModel )table.getModel() ).getResolversAndActions( row );
      final PathToResolve path = resolveContextTableModel.getContext().getPathsToResolve().get( row );

      jbc.addActionListener( new ActionListener()
      {

        public void actionPerformed( ActionEvent e )
        {
          Object key = jbc.getSelectedItem();
          if( key instanceof Resolver )
          {
            path.setResolver( key );
          }
          if( path.resolve() )
          {
            path.setSolved( true );
            jbc.addItem( "Resolved" );
            jbc.setSelectedIndex( jbc.getItemCount() - 1 );

            // for (int cnt = 0; cnt <
            // resolveContextTableModel.getContext().getPathsToResolve().size();
            // cnt++)
            // {
            // PathToResolve otherPath =
            // resolveContextTableModel.getContext().getPathsToResolve().get(cnt);
            // if (path != otherPath & !otherPath.isResolved())
            // {
            // otherPath.getOwner().afterLoad();
            // otherPath.getOwner().resolve(resolveContextTableModel.getContext());
            // if (otherPath.isResolved())
            // {
            // JComboBox jbcOther = ((ResolveContextTableModel)
            // table.getModel())
            // .getResolversAndActions(cnt);
            // jbcOther.addItem("Resolved");
            // jbcOther.setSelectedIndex(jbcOther.getItemCount() - 1);
            // }
            // }
            // }
          }
        }

      } );
      return jbc;
    }

    public Object getCellEditorValue()
    {
      return null;
    }

  }

  @SuppressWarnings( "serial" )
  private class PathCellRenderer extends DefaultTableCellRenderer
  {
    private Color greenColor = Color.GREEN.darker().darker();
    private Color redColor = Color.RED.darker().darker();

    @SuppressWarnings( "unchecked" )
    @Override
    public Component getTableCellRendererComponent( JTable arg0, Object arg1, boolean arg2, boolean arg3, int arg4,
        int arg5 )
    {
      Component comp = super.getTableCellRendererComponent( arg0, arg1, arg2, arg3, arg4, arg5 );

      List<? extends PathToResolve> paths = resolveContextTableModel.getContext().getPathsToResolve();
      PathToResolve ptr = arg4 >= paths.size() ? null : paths.get( arg4 );
      // boolean resolved = ptr.getResolver() != null &&
      // ptr.getResolver().isResolved();

      if( ptr != null && ptr.isResolved() )
      {
        comp.setForeground( greenColor );
        setText( ptr.getPath() );
      }
      else
      {
        comp.setForeground( redColor );
      }

      return comp;
    }
  }

}
TOP

Related Classes of com.eviware.soapui.support.resolver.ResolveDialog$ResolverRenderer

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.