All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jive.PipePanel Maven / Gradle / Ivy

The newest version!
package jive;

import fr.esrf.TangoApi.*;
import fr.esrf.Tango.*;
import fr.esrf.tangoatk.widget.util.ATKConstant;
import fr.esrf.tangoatk.widget.util.ErrorPane;
import fr.esrf.tangoatk.widget.util.chart.JLDataView;
import fr.esrf.tangoatk.widget.util.chart.JLChart;
import fr.esrf.tangoatk.widget.attribute.NumberImageViewer;
import fr.esrf.TangoDs.TangoConst;

import java.util.List;
import java.util.TimeZone;
import javax.swing.*;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.awt.event.*;
import java.text.SimpleDateFormat;

/**
 * The pipe panel.
 */
class PipePanel extends JPanel implements ActionListener,ListSelectionListener,TangoConst,MouseListener,ClipboardOwner,DragGestureListener,DragSourceListener {

  private List  pipeInfo;
  private ConsolePanel    console;
  private DeviceProxy     device;
  private CommonPanel     common;

  private JComboBox   arginCombo;
  private JLabel      arginLabel;
  private JLabel      descrLabel;

  private JList       pipeList;
  private JScrollPane pipeView;

  private JTextArea    descrList;
  private JScrollPane  descrView;

  private JButton      readBtn;
  private JButton      writeBtn;
  private JButton      helpBtn;

  private JPopupMenu   copyMenu;
  private JMenuItem    copyAttributeMenuItem;
  private JMenuItem    copyDevAttributeMenuItem;

  /**
   * Construct the pipe panel
   * @param ds DeviceProxy
   */
  PipePanel(DeviceProxy ds,ConsolePanel console,CommonPanel common) throws DevFailed {

    setLayout(null);

    this.console = console;
    this.common = common;
    this.device = ds;
    pipeInfo = getPipeInfo();

    arginLabel = new JLabel("Argin value");
    arginLabel.setFont(ATKConstant.labelFont);
    add(arginLabel);

    descrLabel = new JLabel();
    descrLabel.setFont(ATKConstant.labelFont);
    descrLabel.setHorizontalAlignment(JLabel.RIGHT);
    add(descrLabel);

    arginCombo = new JComboBox();
    arginCombo.setEditable(true);
    arginCombo.setFont(ATKConstant.labelFont);
    add(arginCombo);

    DefaultListModel ml = new DefaultListModel();
    for (int i = 0; i < pipeInfo.size(); i++)
      ml.add(i, pipeInfo.get(i).getName());
    pipeList = new JList(ml);
    pipeList.addListSelectionListener(this);
    pipeList.addMouseListener(this);
    DragSource dragSource = DragSource.getDefaultDragSource();
    dragSource.createDefaultDragGestureRecognizer(pipeList,
        DnDConstants.ACTION_MOVE,
        this);

    pipeView = new JScrollPane(pipeList);
    add(pipeView);

    descrList = new JTextArea();
    descrList.setFont(new Font("monospaced", Font.PLAIN, 12));
    descrList.setEditable(false);
    descrView = new JScrollPane(descrList);
    add(descrView);

    readBtn = new JButton("Read");
    readBtn.setFont(ATKConstant.labelFont);
    add(readBtn);
    readBtn.addActionListener(this);

    writeBtn = new JButton("Write");
    writeBtn.setFont(ATKConstant.labelFont);
    add(writeBtn);
    writeBtn.addActionListener(this);

    helpBtn = new JButton("Help");
    helpBtn.setFont(ATKConstant.labelFont);
    add(helpBtn);
    helpBtn.addActionListener(this);

    addComponentListener(new ComponentListener() {

      public void componentHidden(ComponentEvent e) {}

      public void componentMoved(ComponentEvent e) {}

      public void componentResized(ComponentEvent e) {
        placeComponents(getSize());
      }

      public void componentShown(ComponentEvent e) {
        placeComponents(getSize());
      }
    });

    // Default

    pipeList.setSelectedIndex(0);

    // Popup menu
    copyMenu = new JPopupMenu();
    copyAttributeMenuItem = new JMenuItem("Copy pipe name");
    copyAttributeMenuItem.addActionListener(this);
    copyMenu.add(copyAttributeMenuItem);
    copyDevAttributeMenuItem = new JMenuItem("Copy device/pipe name");
    copyDevAttributeMenuItem.addActionListener(this);
    copyMenu.add(copyDevAttributeMenuItem);

  }

  // -----------------------------------------------------

  public void valueChanged(ListSelectionEvent e) {

    int idx = pipeList.getSelectedIndex();
    if(pipeInfo.size()==0) return; // Empty set
    PipeInfo pi = pipeInfo.get(idx);

    if(!e.getValueIsAdjusting()) {

      if(pi.isWritable()) {
        descrLabel.setText("  Blobname,[ Name1,type1,value1 ],... (Help for details)");
        arginCombo.setEnabled(true);
        writeBtn.setEnabled(true);
        helpBtn.setEnabled(true);
      } else {
        descrLabel.setText("");
        arginCombo.setEnabled(false);
        writeBtn.setEnabled(false);
        helpBtn.setEnabled(false);
      }

      descrList.setText(
          "Name         " + pi.getName() + "\n" +
              "Label        " + pi.getLabel() + "\n" +
              "Writable     " + Boolean.toString(pi.isWritable()) + "\n" +
              "Level        " + pi.getLevel() + "\n" +
              "Descr        " + pi.getDescription() );

      descrList.setCaretPosition(0);

    }

  }

  // -----------------------------------------------------

  public void mouseClicked(MouseEvent e) {
    Object src = e.getSource();

    if( src== pipeList) {

      if(e.getButton() == MouseEvent.BUTTON1 && e.getClickCount()==2) {
        readPipe();
      }

      if(e.getButton() == MouseEvent.BUTTON3) {
        copyMenu.show(pipeList, e.getX() , e.getY());
      }

    }
  }

  public void mousePressed(MouseEvent e) {}
  public void mouseReleased(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e) {}

  // -----------------------------------------------------

  public void dragGestureRecognized(DragGestureEvent dragGestureEvent) {
    dragGestureEvent.startDrag(DragSource.DefaultMoveDrop,new TransferableString(getCopyString(false)),this);
  }

  public void dragDropEnd(DragSourceDropEvent dragSourceDropEvent) {
  }

  public void dragEnter(DragSourceDragEvent dragSourceDragEvent) {
    DragSourceContext context = dragSourceDragEvent.getDragSourceContext();
    context.setCursor(DragSource.DefaultMoveDrop);
  }

  public void dragExit(DragSourceEvent dragSourceEvent) {
  }

  public void dragOver(DragSourceDragEvent dragSourceDragEvent) {
  }

  public void dropActionChanged(DragSourceDragEvent dragSourceDragEvent) {
  }

  // -----------------------------------------------------

  public void actionPerformed(ActionEvent e) {

    Object src = e.getSource();

    if(src == readBtn) {
      readPipe();
    } else if(src == writeBtn) {
      writePipe();
    } else if(src == helpBtn) {

      String helpMessage =
          "Argin syntax for a blob:\n" +
          " Blobname,[ Name1,type1,value1 ],[ Name2,typ2,value2 ],... \n" +
          " where the value is formatted as \n" +
          "   D,1,2.5,3,4      (double)\n" +
          "   F,1.0,2.3,4,4    (float)\n" +
          "  UC,1,2,3,4        (unsigned char)\n" +
          "   S,1,-2,3,4       (short)\n" +
          "  US,1,2,3,4        (unsigned short)\n" +
          "   L,1,-2,3,4       (long)\n" +
          "  UL,1,2,3,4        (unsigned long)\n" +
          "  LL,1,2,3,4        (int64)\n" +
          "  ST,ON,OFF,STANDY  (state)\n" +
          " STR,\"str 1\",str2   (string)\n" +
          " [ blob ]   (inner blob)\n";
      JOptionPane.showMessageDialog(this,helpMessage,"Argin syntax",JOptionPane.INFORMATION_MESSAGE);

    } else if(src==copyAttributeMenuItem) {
      copyAttributeToClipboard(true);
    } else if(src==copyDevAttributeMenuItem) {
      copyAttributeToClipboard(false);
    }

  }

  public void lostOwnership(java.awt.datatransfer.Clipboard clipboard, Transferable contents) {
  }

  public Dimension getPreferredSize() {
    return getMinimunSize();
  }

  public Dimension getMinimunSize() {
    return new Dimension(470,210);
  }


  // -----------------------------------------------------
  private String getCopyString(boolean copyNameOnly) {

    String copyStr = "";

    PipeInfo ai = pipeInfo.get(pipeList.getSelectedIndex());
    if( copyNameOnly ) {
      copyStr = ai.getName();
    } else {
      copyStr = device.get_name() + "/" + ai.getName();
    }

    return copyStr;

  }

  private void copyAttributeToClipboard(boolean copyNameOnly) {

    StringSelection stringSelection = new StringSelection( getCopyString(copyNameOnly) );
    java.awt.datatransfer.Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    clipboard.setContents( stringSelection, this );

  }

  // -----------------------------------------------------
  // Conversion
  // -----------------------------------------------------

  static String getFormatString(AttributeInfo ai) {

    switch (ai.data_format.value()) {
      case AttrDataFormat._SCALAR:
        return "Scalar";
      case AttrDataFormat._SPECTRUM:
        return "Spectrum";
      case AttrDataFormat._IMAGE:
        return "Image";
    }
    return  "Unknown";

  }

  static String getWriteString(AttributeInfo ai) {

    switch(ai.writable.value()) {

      case AttrWriteType._READ:
        return "READ";
      case AttrWriteType._READ_WITH_WRITE:
        return "READ_WITH_WRITE";
      case AttrWriteType._READ_WRITE:
        return "READ_WRITE";
      case AttrWriteType._WRITE:
        return "WRITE";

    }

    return  "Unknown";

  }

  // -----------------------------------------------------
  // Private stuff
  // -----------------------------------------------------
  private List getPipeInfo() throws DevFailed {

    return device.getPipeConfig();

  }

  private void placeComponents(Dimension dim) {

    arginLabel.setBounds(10,0,80,20);
    descrLabel.setBounds(90,0,dim.width-100,20);
    arginCombo.setBounds(10,20,dim.width-20,25);

    pipeView.setBounds(10, 50, 190, dim.height - 60);
    pipeView.revalidate();

    descrView.setBounds(205,50,dim.width-215,dim.height-90);
    descrView.revalidate();

    int dim2 = (dim.width - 220) / 3;

    readBtn.setBounds(205,dim.height-35,dim2,25);
    writeBtn.setBounds(205+dim2+2,dim.height-35,dim2,25);
    helpBtn.setBounds(205 + 2 * dim2 + 5, dim.height - 35, dim2, 25);

  }

  private void addArgin(String text) {
    // Add the input string if not already done
    boolean found = false;
    int i = 0;
    while(i common.getAnswerLimitMax()) {
      indent(level, retStr);
      retStr.append("Array cannot be fully displayed. (You may change the AnswerLimitMax)\n");
      return common.getAnswerLimitMax();
    } else {
      return length;
    }

  }


  private int getLimitMin(int level, StringBuffer retStr, int length) {

    if (length <= common.getAnswerLimitMin()) {
      indent(level, retStr);
      retStr.append("Array cannot be displayed. (You may change the AnswerLimitMin)\n");
      return length;
    } else {
      return common.getAnswerLimitMin();
    }

  }

  private PipeBlob parseData(String argin) throws NumberFormatException {

    ArgParser arg = new ArgParser(argin);
    return arg.parse_pipe();

  }

  private void printArrayItem(StringBuffer str,int idx,boolean printIdx,
                              String value,int level) {

     indent(level+1, str);
     if(printIdx)
       str.append("Read [" + idx + "]\t" + value + "\n");
     else
       str.append("Read:\t" + value + "\n");

  }

  private String extractData(int level,PipeDataElement data) {

    StringBuffer ret_string = new StringBuffer();
    boolean printIndex;

    try {

      // Add values
      switch (data.getType()) {

        case Tango_DEV_STATE:
        {
          DevState[] dummy = data.extractDevStateArray();
          printIndex = dummy.length>1;
          if(printIndex) ret_string.append(" Array length=" + Integer.toString(dummy.length));
          ret_string.append("\n");
          int start = getLimitMin(level,ret_string,dummy.length);
          int end = getLimitMax(level,ret_string,dummy.length);
          for (int i = start; i < end; i++)
            printArrayItem(ret_string,i,printIndex,Tango_DevStateName[dummy[i].value()],level);
        }
        break;

        case Tango_DEV_UCHAR:
        {
          short[] dummy = data.extractUCharArray();
          printIndex = dummy.length>1;
          if(printIndex) ret_string.append(" Array length=" + Integer.toString(dummy.length));
          ret_string.append("\n");
          int start = getLimitMin(level,ret_string,dummy.length);
          int end = getLimitMax(level,ret_string,dummy.length);
          for (int i = start; i < end; i++)
            printArrayItem(ret_string,i,printIndex,Short.toString(dummy[i]),level);
        }
        break;

        case Tango_DEV_SHORT:
        {
          short[] dummy = data.extractShortArray();
          printIndex = dummy.length>1;
          if(printIndex) ret_string.append(" Array length=" + Integer.toString(dummy.length));
          ret_string.append("\n");
          int start = getLimitMin(level,ret_string,dummy.length);
          int end = getLimitMax(level,ret_string,dummy.length);
          for (int i = start; i < end; i++)
            printArrayItem(ret_string,i,printIndex,Short.toString(dummy[i]),level);
        }
        break;

        case Tango_DEV_BOOLEAN:
        {
          boolean[] dummy = data.extractBooleanArray();
          printIndex = dummy.length>1;
          if(printIndex) ret_string.append(" Array length=" + Integer.toString(dummy.length));
          ret_string.append("\n");
          int start = getLimitMin(level,ret_string,dummy.length);
          int end = getLimitMax(level,ret_string,dummy.length);
          for (int i = start; i < end; i++)
            printArrayItem(ret_string,i,printIndex,Boolean.toString(dummy[i]),level);
        }
        break;

        case Tango_DEV_USHORT:
        {
          int[] dummy = data.extractUShortArray();
          printIndex = dummy.length>1;
          if(printIndex) ret_string.append(" Array length=" + Integer.toString(dummy.length));
          ret_string.append("\n");
          int start = getLimitMin(level,ret_string,dummy.length);
          int end = getLimitMax(level,ret_string,dummy.length);
          for (int i = start; i < end; i++)
            printArrayItem(ret_string,i,printIndex,Integer.toString(dummy[i]),level);
        }
        break;

        case Tango_DEV_LONG:
        {
          int[] dummy = data.extractLongArray();
          printIndex = dummy.length>1;
          if(printIndex) ret_string.append(" Array length=" + Integer.toString(dummy.length));
          ret_string.append("\n");
          int start = getLimitMin(level,ret_string,dummy.length);
          int end = getLimitMax(level,ret_string,dummy.length);
          for (int i = start; i < end; i++)
            printArrayItem(ret_string,i,printIndex,Integer.toString(dummy[i]),level);
        }
        break;

        case Tango_DEV_ULONG:
        {
          long[] dummy = data.extractULongArray();
          printIndex = dummy.length>1;
          if(printIndex) ret_string.append(" Array length=" + Integer.toString(dummy.length));
          ret_string.append("\n");
          int start = getLimitMin(level,ret_string,dummy.length);
          int end = getLimitMax(level,ret_string,dummy.length);
          for (int i = start; i < end; i++)
            printArrayItem(ret_string,i,printIndex,Long.toString(dummy[i]),level);
        }
        break;

        case Tango_DEV_LONG64:
        {
          long[] dummy = data.extractLong64Array();
          printIndex = dummy.length>1;
          if(printIndex) ret_string.append(" Array length=" + Integer.toString(dummy.length));
          ret_string.append("\n");
          int start = getLimitMin(level,ret_string,dummy.length);
          int end = getLimitMax(level,ret_string,dummy.length);
          for (int i = start; i < end; i++)
            printArrayItem(ret_string,i,printIndex,Long.toString(dummy[i]),level);
        }
        break;

        case Tango_DEV_ULONG64:
        {
          long[] dummy = data.extractULong64Array();
          printIndex = dummy.length>1;
          if(printIndex) ret_string.append(" Array length=" + Integer.toString(dummy.length));
          ret_string.append("\n");
          int start = getLimitMin(level,ret_string,dummy.length);
          int end = getLimitMax(level,ret_string,dummy.length);
          for (int i = start; i < end; i++)
            printArrayItem(ret_string,i,printIndex,Long.toString(dummy[i]),level);
        }
        break;

        case Tango_DEV_DOUBLE:
        {
          double[] dummy = data.extractDoubleArray();
          printIndex = dummy.length>1;
          if(printIndex) ret_string.append(" Array length=" + Integer.toString(dummy.length));
          ret_string.append("\n");
          int start = getLimitMin(level,ret_string,dummy.length);
          int end = getLimitMax(level,ret_string,dummy.length);
          for (int i = start; i < end; i++)
            printArrayItem(ret_string,i,printIndex,Double.toString(dummy[i]),level);
        }
        break;

        case Tango_DEV_FLOAT:
        {
          float[] dummy = data.extractFloatArray();
          printIndex = dummy.length>1;
          if(printIndex) ret_string.append(" Array length=" + Integer.toString(dummy.length));
          else ret_string.append("\n");
          int start = getLimitMin(level,ret_string,dummy.length);
          int end = getLimitMax(level,ret_string,dummy.length);
          for (int i = start; i < end; i++)
            printArrayItem(ret_string,i,printIndex,Float.toString(dummy[i]),level);
        }
        break;

        case Tango_DEV_STRING:
        {
          String[] dummy = data.extractStringArray();
          printIndex = dummy.length>1;
          if(printIndex) ret_string.append(" Array length=" + Integer.toString(dummy.length));
          ret_string.append("\n");
          int start = getLimitMin(level,ret_string,dummy.length);
          int end = getLimitMax(level,ret_string,dummy.length);
          for (int i = start; i < end; i++)
            printArrayItem(ret_string,i,printIndex,dummy[i],level);
        }
        break;

        case Tango_DEV_ENCODED:
        {
          DevEncoded[] e = data.extractDevEncodedArray();
          for (int j = 0; j < e.length; j++) {
            if(e.length>1) {
              indent(level,ret_string);
              console.print("Item #"+j+"\n");
            }
            indent(level, ret_string);
            ret_string.append("Format: " + e[j].encoded_format + "\n");
            printIndex = e[j].encoded_data.length>1;
            if(printIndex) ret_string.append(" Array length=" + Integer.toString(e[j].encoded_data.length));
            ret_string.append("\n");
            int start = getLimitMin(level, ret_string, e[j].encoded_data.length);
            int end = getLimitMax(level, ret_string, e[j].encoded_data.length);
            for (int i = start; i < end; i++) {
              short vs = (short) e[j].encoded_data[i];
              vs = (short) (vs & 0xFF);
              printArrayItem(ret_string, i, printIndex, Short.toString(vs), level);
            }
          }
        }
        break;

        default:
          indent(level,ret_string);
          ret_string.append("Unsupported type code="+data.getType()+"\n");
          break;
      }

    } catch (DevFailed e) {

      ErrorPane.showErrorMessage(this,device.name() + "/" + data.getName(),e);

    }

    return ret_string.toString();

  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy