//Copyright © 2009 by JMethod.com. All rights reserved.

 

import java.awt.Font;

import java.awt.Insets;

import java.awt.Toolkit;

import javax.swing.DefaultListModel;

import javax.swing.JDialog;

import javax.swing.JOptionPane;

import javax.swing.ListSelectionModel;

import javax.swing.SwingUtilities;

import javax.swing.UIManager;

 

import com.jmethod.jdialup.JDNotification;

import com.jmethod.jdialup.JDState;

import com.jmethod.jdialup.JDial;

import com.jmethod.jdialup.JDException;

import java.awt.BorderLayout;

 

import com.jmethod.jdialup.*;

 

public class JDialSample extends javax.swing.JFrame {

 

  private class SampleNotification implements JDNotification {

 

    public void notify( String entry, int state, int error ) {

      String mes;

      if ( state == JDState.DIAL_TIMEOUT ) {

        mes = entry + ": state[" + state + "] --> DIAL TIMEOUT";

      } else {

        mes = entry + ": state[" + state + "] --> " + JDState.getStateString( state );

      }

      if ( error != 0 ) {

        // if there is error

        mes = entry + ": error[" + error + "] --> " + JDial.getErrorMessage( error );

      }

      final String mes2 = mes;

      System.out.println( mes );

      SwingUtilities.invokeLater(

        // to be executed in Swing thread

        new Runnable() {

          public void run() {

            textArea.setText( textArea.getText() + mes2 + "\r\n" );

            textArea.setCaretPosition( textArea.getText().length() );

          }

      });

    } // notify

  } // class SampleNotification

 

  private JDial    jd                           = null;

  private SampleNotification sampleNotification = new SampleNotification();

  private DefaultListModel entryListModel       = new DefaultListModel();

 

  public JDialSample() {

    initComponents();

    entryList.setModel( entryListModel );

    try {

      // create JDial instance and set sampleNotification as a feedback class (notifier)

      jd = new JDial( sampleNotification );

    } catch ( JDException ex ) {

      System.err.println( ex );

      System.err.println( ex.getCause() );

      System.exit( 0 );

    } // try

    this.updateList();

 

    int wFrame = 450;

    int hFrame = 220 + 154;

 

    this.setSize( new java.awt.Dimension( wFrame, hFrame ) );

 

    // --------------------- Center the window -----------------------

    int wScreen = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();

    int hScreen = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();

    this.setLocation( ( wScreen - wFrame ) / 2, ( hScreen - hFrame ) / 2 );

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

    this.setResizable( false );

    entryList.setSelectedIndex( 0 );

 

    // setting ShutDownHook

    Runtime.getRuntime().addShutdownHook( new Thread() {

      public void run() {

        endApp();

      }

    });

  } // JDialSample

 

  // ShutDownHook method

  private void endApp() {

    String[] conns = jd.getDialingConns();

    if ( conns != null ) {

      for ( int i = 0; i < conns.length; i++ ) {

        jd.hangUp( conns[i] );

      } // for

    } // if

  } // endApp

 

  private void initComponents() {

    createButton = new javax.swing.JButton();

    editButton = new javax.swing.JButton();

    deleteButton = new javax.swing.JButton();

    renameButton = new javax.swing.JButton();

    updateButton = new javax.swing.JButton();

    connectButton = new javax.swing.JButton();

    hangupButton = new javax.swing.JButton();

    jScrollPane1 = new javax.swing.JScrollPane();

    jScrollPane2 = new javax.swing.JScrollPane();

    entryList = new javax.swing.JList();

    textArea = new javax.swing.JTextArea();

    textArea.setEditable( false );

    textArea.setFont( new Font("Monospaced", 0, 12 ) );

    createModemButton = new javax.swing.JButton();

 

    getContentPane().setLayout(null);

 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    setTitle("JDialUp API Sample");

 

    createModemButton.setText("Create Modem Entry");

    createModemButton.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(java.awt.event.ActionEvent evt) {

        createModemButtonAp(evt);

      }

    });

 

    getContentPane().add(createModemButton);

    createModemButton.setMargin( new Insets( 0, 0, 0, 0 ) );

    createModemButton.setBounds(315, 10, 110, 23);

 

    createButton.setText("Create Entry");

    createButton.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(java.awt.event.ActionEvent evt) {

        createButtonAp(evt);

      }

    });

 

    getContentPane().add(createButton);

    createButton.setBounds(315, 40, 110, 23);

 

    editButton.setText("Edit Entry");

    editButton.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(java.awt.event.ActionEvent evt) {

        editButtonAp(evt);

      }

    });

 

    getContentPane().add(editButton);

    editButton.setBounds(315, 70, 110, 23);

 

    deleteButton.setText("Delete Entry");

    deleteButton.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(java.awt.event.ActionEvent evt) {

        deleteButtonAp(evt);

      }

    });

 

    getContentPane().add(deleteButton);

    deleteButton.setBounds(315, 130, 110, 23);

 

    renameButton.setText("Rename Entry");

    renameButton.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(java.awt.event.ActionEvent evt) {

        renameButtonAp(evt);

      }

    });

 

    getContentPane().add(renameButton);

    renameButton.setBounds(315, 100, 110, 23);

 

    updateButton.setText("Update Entries");

    updateButton.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(java.awt.event.ActionEvent evt) {

        updateButtonAp(evt);

      }

    });

 

    getContentPane().add(updateButton);

    updateButton.setBounds(315, 165, 110, 23);

 

    connectButton.setText("Connect");

    connectButton.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(java.awt.event.ActionEvent evt) {

        connectButtonAp(evt);

      }

    });

 

    getContentPane().add(connectButton);

    connectButton.setBounds(10, 314, 100, 23);

 

    hangupButton.setText("Hang up");

    hangupButton.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(java.awt.event.ActionEvent evt) {

        hangupButtonAp(evt);

      }

    });

 

    getContentPane().add(hangupButton);

    hangupButton.setBounds(117, 314, 110, 23);

    jScrollPane1.setViewportView(entryList);

    jScrollPane2.setViewportView(textArea);

 

    getContentPane().add(jScrollPane1);

    jScrollPane1.setBounds(10, 10, 290, 143);

 

    getContentPane().add(jScrollPane2);

    jScrollPane2.setBounds(10, 165, 290, 143);

  } // initComponents

 

  private void updateList() {

    SwingUtilities.invokeLater(

    // to be executed in Swing thread

    new Runnable() {

      public void run() {

        entryListModel.clear();

        try {

          String[] names = jd.getEntries();

          for ( int i=0; i < names.length; i++ ) {

            entryListModel.addElement( names[i] );

          } // for

          entryList.repaint();

        } catch ( Exception e ) {

        } // try

        entryList.setSelectedIndex( 0 );

      }

    });

  } // updateList

 

  private void hangupButtonAp(java.awt.event.ActionEvent evt) {

    int savedIndex = this.entryList.getSelectedIndex();

    Object[] entries = this.entryList.getSelectedValues();

    if ( entries == null  ) return;

    for ( int i = 0; i < entries.length; i++ ) {

      jd.hangUp( (String) entries[i] );

    } // for

    entryList.setSelectedIndex( savedIndex );

  } // hangupButtonAp

 

  private void connectButtonAp(java.awt.event.ActionEvent evt) {

    int savedIndex = this.entryList.getSelectedIndex();

    Object[] entries = this.entryList.getSelectedValues();

    if ( entries == null  ) return;

    for ( int i = 0; i < entries.length; i++ ) {

      jd.dialAsyncProcess( (String) entries[i] );

    } // for

    entryList.setSelectedIndex( savedIndex );

  } // connectButtonAp

 

  private void updateButtonAp(java.awt.event.ActionEvent evt) {

    this.updateList();

  } // updateButtonAp

 

  private void renameButtonAp(java.awt.event.ActionEvent evt) {

    Object[] entries = this.entryList.getSelectedValues();

    if ( entries == null  ) return;

    String message = "New entry name";

    for ( int i = 0; i < entries.length; i++ ) {

      String newname = (String) JOptionPane.showInputDialog( this, message, "Rename entry",

        JOptionPane.PLAIN_MESSAGE, null, null, (String) entries[i] );

      if ( newname != null && !newname.equals( (String) entries[i] ) ) {

        jd.renameEntry( (String) entries[i], newname );

      } // if

    } // for

    this.updateList();

  } // renameButtonAp

 

  private void deleteButtonAp(java.awt.event.ActionEvent evt) {

    Object[] entries = this.entryList.getSelectedValues();

    if ( entries == null  ) return;

    for ( int i = 0; i < entries.length; i++ ) {

      int reply = JOptionPane.showConfirmDialog( this,

                              "Delete " + entries[i] + "?",

                              "Confirm" ,

                              JOptionPane.YES_NO_OPTION,

                              JOptionPane.PLAIN_MESSAGE);

      if ( reply == JOptionPane.YES_OPTION ) {

        jd.deleteEntry( (String) entries[i] );

      } // if

    } // for

    this.updateList();

  } // deleteButtonAp

 

  private void editButtonAp(java.awt.event.ActionEvent evt) {

    Thread runner = new Thread() {

      public void run() {

        SwingUtilities.invokeLater(

          // to be executed in Swing thread

          new Runnable() {

            public void run() {

              int savedIndex = JDialSample.this.entryList.getSelectedIndex();

              String entry = (String) JDialSample.this.entryList.getSelectedValue();

              if (entry == null) return;

              jd.showEditEntryDialog( entry );

              entryList.setSelectedIndex( savedIndex );

            }

        });

      } // run

    }; // class

    runner.start();

  } // editButtonAp

 

  private void createButtonAp(java.awt.event.ActionEvent evt) {

    Thread runner = new Thread() {

      public void run() {

        jd.showCreateEntryDialog();

        updateList();

      } // run

    }; // class

    runner.start();

  } // createButtonAp

 

  private void createModemButtonAp(java.awt.event.ActionEvent evt) {

    if ( jd.getModemDeviceNames() == null || jd.getModemDeviceNames().length == 0  ) {

      javax.swing.JOptionPane.showMessageDialog( this, "There are no modem devices" );

      return;

    } // if

 

    ModemEntryDialog modemDialog = new ModemEntryDialog( jd );

    modemDialog.setModal( true );

    modemDialog.setSize( new java.awt.Dimension( 300, 340 ) );

    modemDialog.setLocationRelativeTo( this );

    modemDialog.updateModemList();

    modemDialog.setVisible( true );

    modemDialog.dispose();

    this.updateList();

  } // createModemButtonAp

 

  public static void main( String args[] ){

    try {

      UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" );

    } catch( Exception ex ) {

    } // try

    java.awt.EventQueue.invokeLater(new Runnable() {

      public void run() {

        new JDialSample().setVisible(true);

      }

    });

  } // main

 

  private javax.swing.JButton connectButton;

  private javax.swing.JButton deleteButton;

  private javax.swing.JButton hangupButton;

  private javax.swing.JButton editButton;

  private javax.swing.JList entryList;

  private javax.swing.JScrollPane jScrollPane1;

  private javax.swing.JButton createButton;

  private javax.swing.JButton updateButton;

  private javax.swing.JButton renameButton;

  private javax.swing.JScrollPane jScrollPane2;

  private javax.swing.JTextArea textArea;

  private javax.swing.JButton createModemButton;

} // class JDialSample

 

 

class ModemEntryDialog extends JDialog {

 

  private JDial  jd = null;

 

  protected ModemEntryDialog( JDial jd ) {

    this.jd = jd;

    initComponents();

    setTitle( "Fill in data fields" );

    this.setResizable( false );

  } // ModemEntryDialog

 

  private void okButtonAp(java.awt.event.ActionEvent evt) {

    jd.createModemEntry( this.newModemEntryName.getText(),

      (String)this.modemList.getSelectedValue(),

      this.modemLoginField.getText(),

      this.modemPasswordField.getText(),

      this.phoneField.getText() );

    this.setVisible( false );

  } // okButtonAp

 

  private void cancelButtonAp(java.awt.event.ActionEvent evt) {

    this.setVisible( false );

  } // cancelButtonAp

 

  private void initComponents() {

    modemList = new javax.swing.JList();

    scrollPane = new javax.swing.JScrollPane();

    phoneLabel = new javax.swing.JLabel();

    phoneField = new javax.swing.JTextField();

    modemNameLabel = new javax.swing.JLabel();

    newModemEntryName = new javax.swing.JTextField();

    newModemEntryLabel = new javax.swing.JLabel();

    modemLoginField = new javax.swing.JTextField();

    loginLabel = new javax.swing.JLabel();

    modemPasswordField = new javax.swing.JTextField();

    modelPasswordLabel = new javax.swing.JLabel();

    okButton = new javax.swing.JButton();

    cancelButton = new javax.swing.JButton();

 

    this.getContentPane().setLayout(null);

 

    modemNameLabel.setText("Choose modem");

    this.getContentPane().add(modemNameLabel);

    modemNameLabel.setBounds(20, 10, 100, 14);

 

    this.getContentPane().add(newModemEntryName);

    newModemEntryName.setBounds(20, 100, 250, 20);

 

    newModemEntryLabel.setText("Entry name");

    this.getContentPane().add(newModemEntryLabel);

    newModemEntryLabel.setBounds(20, 80, 90, 14);

 

    this.getContentPane().add(modemLoginField);

    modemLoginField.setBounds(20, 150, 250, 20);

 

    loginLabel.setText("Login");

    this.getContentPane().add(loginLabel);

    loginLabel.setBounds(20, 130, 25, 14);

 

    this.getContentPane().add(modemPasswordField);

    modemPasswordField.setBounds(20, 200, 250, 20);

 

    modelPasswordLabel.setText("Password");

    this.getContentPane().add(modelPasswordLabel);

    modelPasswordLabel.setBounds(20, 180, 60, 14);

 

    modemListModel = new DefaultListModel();

    modemList.setModel( modemListModel );

    modemList.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );

    scrollPane.setViewportView( modemList );

    this.getContentPane().add( modemList );

    modemList.setBounds(20, 30, 250, 40);

 

    phoneLabel.setText("Phone #");

    this.getContentPane().add(phoneLabel);

    phoneLabel.setBounds(20, 230, 100, 14);

 

    this.getContentPane().add(phoneField);

    phoneField.setBounds(20, 250, 250, 20);

 

    okButton.setText( "OK" );

    this.getContentPane().add( okButton );

    okButton.setBounds( 20, 279, 100, 23);

    okButton.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(java.awt.event.ActionEvent evt) {

        okButtonAp(evt);

      }

    });

 

    cancelButton.setText( "Cancel" );

    this.getContentPane().add( cancelButton );

    cancelButton.setBounds( 127, 279, 100, 23);

    cancelButton.addActionListener(new java.awt.event.ActionListener() {

      public void actionPerformed(java.awt.event.ActionEvent evt) {

        cancelButtonAp(evt);

      }

    });

  } // initComponents

 

  protected void updateModemList() {

    modemListModel.clear();

    try {

      String[] names = jd.getModemDeviceNames();

      for ( int i=0; i < names.length; i++ ) {

        modemListModel.addElement( names[i] );

      } // for

      this.modemList.repaint();

      this.modemList.setSelectedIndex( 0 );

    } catch ( Exception e ) {

    } // try

  } // updateModemList

 

  private javax.swing.JLabel phoneLabel;

  private javax.swing.JTextField phoneField;

  private javax.swing.JLabel loginLabel;

  private javax.swing.JLabel modelPasswordLabel;

  private javax.swing.JTextField modemLoginField;

  private javax.swing.JLabel modemNameLabel;

  private javax.swing.JTextField modemPasswordField;

  private javax.swing.JLabel newModemEntryLabel;

  private javax.swing.JTextField newModemEntryName;

  private javax.swing.JScrollPane scrollPane;

  private DefaultListModel modemListModel;

  private javax.swing.JList modemList;

  private javax.swing.JButton okButton;

  private javax.swing.JButton cancelButton;

 

} // class ModemEntryDialog