Package net.fenyo.gnetwatch.GUI

Source Code of net.fenyo.gnetwatch.GUI.GUI

/*
* GNetWatch
* Copyright 2006, 2007, 2008 Alexandre Fenyo
* gnetwatch@fenyo.net
*
* This file is part of GNetWatch.
*
* GNetWatch is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* GNetWatch 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNetWatch; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

// icones :
// http://www.kde-look.org/content/show.php?content=8341

// http://www.oxygen-icons.org/?cat=3
// http://icon-king.com/?p=34
// http://www.kde-artists.org/
// http://www.kde-look.org/content/show.php?content=8341

package net.fenyo.gnetwatch.GUI;

import java.io.*;
import java.util.*;
import java.net.*;

import javax.swing.*;

import net.fenyo.gnetwatch.*;
import net.fenyo.gnetwatch.actions.*;
import net.fenyo.gnetwatch.activities.*;
import net.fenyo.gnetwatch.targets.*;
import net.fenyo.gnetwatch.data.*;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.apache.commons.configuration.*;
import org.apache.commons.configuration.tree.xpath.*;

import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.custom.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.browser.*;
import org.hibernate.Session;
import org.snmp4j.security.SecurityLevel;
import org.snmp4j.util.TableEvent;

/**
* Manages the main GUI.
* @author Alexandre Fenyo
* @version $Id: GUI.java,v 1.139 2008/12/05 13:17:38 fenyo Exp $
*/

public class GUI implements Runnable {
  private static Log log = LogFactory.getLog(GUI.class);

  private Config config;
  private Background background;
  private Main main;
  private SNMPManager snmp_manager;
  private Views views;
  private Synchro synchro;

  private AwtGUI awtGUI = null;

  // GUI/SWT/AWT objects
  private Display display = null;

  // main Shell
  private Shell shell = null;
  private GridLayout layout = null;

  // Menu
  private Menu menu_bar = null, menu_file = null;
  private MenuItem menu_item_file = null;
  private MenuItem menu_item_exit = null;
  private MenuItem menu_item_merge_now = null;
  private MenuItem menu_item_hide = null;
  private MenuItem menu_item_show = null;
  private MenuItem menu_item_clear = null;
 
  // Toolbar
  private ToolBar toolbar = null;
  private GridData toolbar_grid_data = null;

  // vertical Sash for horizontal Composite and text console
  private SashForm vertical_sash = null;
  private GridData vertical_sash_grid_data = null;

  // horizontal Composite
  private Composite horizontal_composite = null;
  private GridLayout horizontal_composite_layout = null;

  // text console
  private Browser text_console = null;
  private StringBuffer text_console_content = new StringBuffer();

  // groups composite, groups and childs
  private Composite groups_composite = null;
  private RowLayout groups_composite_layout = null;
  private GridData groups_composite_grid_data = null;
  private Group group_target_subnet = null, group_target_range = null, group_target_host = null, group_target_group = null, group_target_host6 = null;
  // private Group group_data = null;
  private GridLayout group_target_subnet_layout = null, group_target_range_layout = null, group_target_host_layout = null, group_target_group_layout = null, group_target_host6_layout = null;
  // private GridLayout group_data_layout = null;
  private Text target_subnet_address = null, target_subnet_mask = null;
  private Text target_range_begin = null, target_range_end = null;
  private Button target_subnet_push = null, target_range_push = null;
  private Text target_host_value = null;
  private Text target_group_value = null;
  private Text target_host6_value = null;
  private Button target_host_push = null, target_group_push = null, target_host6_push = null;
  private TargetGroup user_defined = null;
  private final int bglevel = 100;

  // horizontal Sash for Tree and Label
  private SashForm horizontal_sash = null;
  private GridData horizontal_sash_grid_data = null;

  // Tree
  private Tree tree = null;
  private TreeColumn tree_column1 = null, tree_column2 = null, tree_column3 = null;

  // bottom status
  private StyledText status = null;
  private GridData status_grid_data = null;

  // progress bar
  private ProgressBar progress_bar = null;
  private GridData progress_bar_grid_data = null;
  private CTabFolder tab_folder = null;
 
  // General variables
  private Thread thread = null;
  private final boolean GUI_created[] = { false };

  // images
  private Image image_folder = null, image_oscillo = null, image_exec = null,
          image_watch = null, image_host = null, image_host6 = null,
          image_host_snmp = null, image_host6_snmp = null,
          image_interface = null, image_queue = null, image_network = null,
          image_multirow = null;

  // visuals
  private VisualElement visual_root = null;
  private VisualElement visual_queues = null;
  private VisualElement visual_transient = null;
  private TargetGroup visual_thishost = null;
//  private VisualElement visual_persistent = null;
  private TargetGroup visual_transient_all = null;
  private TargetGroup visual_transient_networks = null;
//  private VisualElement visual_persistent_all = null;

  private Label label1 = null, label2 = null, label3 = null,
                label4 = null, label5 = null, label6 = null,
                label7 = null;

  private MenuItem menu_item_add_host = null, menu_item_add_host6 = null, menu_item_add_range = null,
                   menu_item_add_network = null, menu_item_add_group = null, menu_item_remove_target = null;

  private ToolItem item_add_host = null, item_add_network = null,
                   item_discover_start = null, item_discover_stop = null,
                   item_remove_target = null, item_add_ping = null, item_remove_action = null;

  private MenuItem menu_item_credentials = null, menu_item_ip_options = null, menu_item_http_options = null, menu_item_generic_options = null;

  private MenuItem menu_item_add_ping = null, menu_item_add_process = null, menu_item_add_source = null, menu_item_add_flood = null, menu_item_add_http = null,
                   menu_item_explore_snmp = null, menu_item_explore_nmap = null, menu_item_remove_action = null,
                   menu_item_remove_action_ping = null, menu_item_remove_action_flood = null,
                   menu_item_remove_action_explore = null, menu_item_remove_view = null,
                   menu_item_remove_view_ping = null, menu_item_remove_view_flood = null,
                   menu_item_remove_view_explore = null;

  VisualElement previous_selection = null;

  // synchronization object for access and modifications to the tree of visual elements
  public Object sync_tree = new Object();

  private final Map<Target, Target> target_map = new HashMap<Target, Target>();

  private CTabItem tab_item1, tab_item2;

  private int text_console_do_not_go_on_top = 0;

  /**
   * Return the configuration.
   * @param none.
   * @return Config configuration.
   */
  public Config getConfig() {
    return config;
  }

  /**
   * Return the root shell.
   * @param none.
   * @return Shell shell.
   */
  public Shell getShell() {
    return shell;
  }

  /**
   * Computes the desired background color.
   * @param none.
   * @return background color.
   */
  public Color getBackgroundColor() {
    return new Color(display, (int) Math.min((int) shell.getBackground().getRed() * 1.05, 255),
        (int) Math.min((int) shell.getBackground().getGreen() * 1.05, 255),
        (int) Math.min((int) shell.getBackground().getBlue() * 1.05, 255));
  }

  /**
   * Returns the SNMPManager instance.
   * @param none.
   * @return SNMPManager instance.
   */
  public SNMPManager getSNMPManager() {
    return snmp_manager;
  }

  /**
   * Returns the Synchro instance.
   * @param none.
   * @return Synchro instance.
   */
  public Synchro getSynchro() {
    return synchro;
  }

  /**
   * Returns the multithreaded synchronization lock for GUI creation.
   * @param none.
   * @return lock.
   */
  public boolean [] getGUICreated() {
    return GUI_created;
  }

  /**
   * Gets the tree node acting as the visual transient root.
   * @param none.
   * @return VisualElement visual transient element.
   */
  public VisualElement getVisualTransient() {
    return visual_transient;
  }

  /**
   * Gets the tree node acting as the "local host" root.
   * @param none.
   * @return TargetGroup visual transient node.
   */
  public TargetGroup getVisualThisHost() {
    return visual_thishost;
  }

  /**
   * Gets the tree node acting as the "every host" root.
   * @param none.
   * @return TargetGroup "every host" node.
   */
  public TargetGroup getVisualTransientAll() {
    return visual_transient_all;
  }

  /**
   * Gets the tree node acting as the "every network" root.
   * @param none.
   * @return TargetGroup "every network" node.
   */
  public TargetGroup getVisualTransientNetworks() {
    return visual_transient_networks;
  }

  /**
   * Returns the AwtGUI instance used to build AWT frames that host Java2D-drawn components.
   * @param none.
   * @return AwtGUI AWT gui.
   */
  // GUI thread
  public AwtGUI getAwtGUI() {
    return awtGUI;
  }

  /**
   * Removes a target.
   * @param target target to remove.
   * @return void.
   */
  // GUI thread
  public void dropTargetInstance(final VisualElement target) {
    target_map.remove(target);
  }

  /**
   * Returns the canonical instance of a target and registers this target as the canonical one if needed.
   * The canonical instance is an instance that equals to this one
   * and that was the first created.
   * @param target instance.
   * @return Target canonical instance.
   */
  // GUI thread
  // lock survey: sync_tree << synchro << HERE
  public Target getCanonicalInstance(final Target target) {
    final Target canonic_instance = target_map.get(target);
    if (canonic_instance == null) {
      target_map.put(target, target);
      return target;
    } else return canonic_instance;
  }

  /**
   * Checks that this instance has already been created.
   * @param target checks against this instance.
   * @return true if this instance has already been created.
   */
  // Capture thread
  // lock survey : sync_tree << synchro << HERE
  // lock survey : sync_tree << HERE
  public boolean containsCanonicalInstance(final Target target) {
    return target_map.get(target) != null;
  }

  /**
   * Execute this operation in the future in the SWT thread.
   * @param r operation to execute.
   * @return void.
   */
  // any thread
  public void asyncExecIfNeeded(final Runnable r) {
    try {
      // If thread is null, the thread GUI is not started.
      if (thread == null || Thread.currentThread().equals(thread)) r.run();
      else if (config != null && config.isEnd() == false && display != null && !display.isDisposed())
        display.asyncExec(r);
    } catch (final Exception ex) {
      if (log != null && ex != null) log.error(ex);
    }
  }

  public void asyncExec(final Runnable r) {
    try {
      if (config != null && config.isEnd() == false && display != null && !display.isDisposed())
        display.asyncExec(r);
    } catch (final Exception ex) {
      log.error(ex);
    }
  }

  /**
   * Returns the tab folder.
   * @param none.
   * @return CTabFolder tab folder.
   */
  // GUI thread
  public CTabFolder getTabFolder() {
    return tab_folder;
  }

  /**
   * Returns the picture "image folder".
   * @param none.
   * @return Image picture.
   */
  // GUI thread
  public Image getImageFolder() {
    return image_folder;
  }

  /**
   * Returns the picture "exec".
   * @param none.
   * @return Image picture.
   */
  // GUI thread
  public Image getImageExec() {
    return image_exec;
  }
 
  /**
   * Returns the picture "oscilloscope".
   * @param none.
   * @return Image picture.
   */
  // GUI thread
  public Image getImageOscillo() {
    return image_oscillo;
  }

  /**
   * Returns the picture "multirow".
   * @param none.
   * @return Image picture.
   */
  // GUI thread
  public Image getImageMultiRow() {
    return image_multirow;
  }

  /**
   * Returns the picture "watch".
   * @param none.
   * @return Image picture.
   */
  // GUI thread
  public Image getImageWatch() {
    return image_watch;
  }

  /**
   * Returns the picture "IPv4 host".
   * @param none.
   * @return Image picture.
   */
  // GUI thread
  public Image getImageHost() {
    return image_host;
  }

  /**
   * Returns the picture "IPv6 host".
   * @param none.
   * @return Image picture.
   */
  // GUI thread
  public Image getImageHost6() {
    return image_host6;
  }

  /**
   * Returns the picture "interface".
   * @param none.
   * @return Image picture.
   */
  // GUI thread
  public Image getImageInterface() {
    return image_interface;
  }

  /**
   * Returns the picture "queue".
   * @param none.
   * @return Image picture.
   */
  // GUI thread
  public Image getImageQueue() {
    return image_queue;
  }

  /**
   * Returns the picture "network".
   * @param none.
   * @return Image picture.
   */
  // GUI thread
  public Image getImageNetwork() {
    return image_network;
  }

  /**
   * Returns the picture "IPv4 SNMP host".
   * @param none.
   * @return Image picture.
   */
  // GUI thread
  // lock survey : sync_tree << synchro << HERE
  public Image getImageHostSNMP() {
    return image_host_snmp;
  }

  /**
   * Returns the picture "IPv6 SNMP host".
   * @param none.
   * @return Image picture.
   */
  // GUI thread
  public Image getImageHost6SNMP() {
    return image_host6_snmp;
  }

  /**
   * Resets the status string.
   * May be called from any thread.
   * @param none.
   * @return void.
   */
  public void setStatus(final String str) {
    asyncExecIfNeeded(new Runnable() {
      public void run() {
        if (status.isDisposed() == false) status.setText(" " + str);
      }
    });
  }

  /**
   * Sets the progress bar position.
   * @param position position.
   * @return void.
   */
  public void setProgress(final int position) {
    asyncExecIfNeeded(new Runnable() {
      public void run() {
        progress_bar.setSelection(position);
      }
    });
  }

  /**
   * Encapsulates an html part into a face definition.
   * @param html html source part.
   * @return embeded html part.
   */
  public String htmlFace(final String html) {
    return "<FONT FACE='Verdana' size='-2'>" + html + "</FONT>";
  }

  /**
   * Adds a string to the console.
   * May be called from any thread.
   * @param none.
   * @return void.
   */
  public void appendConsole(final String str) {
    asyncExecIfNeeded(new Runnable() {
      public void run() {
        text_console_content.append(str);
        text_console.setText("<html><body bgcolor='#" +
            String.format("%2x%2x%2x",
            getBackgroundColor().getRed(),
            getBackgroundColor().getGreen(),
            getBackgroundColor().getBlue()) +
            "'>" +
            htmlFace(text_console_content.toString()) +
            "</body></html>");
      }
    });
  }

  /**
   * Clear console content.
   * May be called from any thread.
   * @param none.
   * @return void.
   */
  public void clearConsole() {
    asyncExecIfNeeded(new Runnable() {
      public void run() {
        text_console_content.setLength(0);
        text_console.setText("<html><body bgcolor='#" +
            String.format("%2x%2x%2x",
            getBackgroundColor().getRed(),
            getBackgroundColor().getGreen(),
            getBackgroundColor().getBlue()) +
            "'>" +
            htmlFace(text_console_content.toString()) +
            "</body></html>");
      }
    });
  }

  /**
   * Check that the selection is under the transient node.
   * @param none.
   * @return true if the selection is under the transient node.
   */
  // GUI thread
  private boolean isSelectionTransient() {
    if (tree.getSelectionCount() == 1) {
      TreeItem current_item = tree.getSelection()[0];
      while (current_item != null &&
          visual_transient.isThisOurTreeItem(current_item) == false /* &&
          visual_persistent.isThisOurTreeItem(current_item) == false */)
        current_item = current_item.getParentItem();
      if (visual_transient.isThisOurTreeItem(current_item)) return true;
    }
    return false;
  }

  // GUI thread
  /*
   private boolean isSelectionPersistent() {
    if (tree.getSelectionCount() == 1) {
      TreeItem current_item = tree.getSelection()[0];
      while (current_item != null &&
          visual_transient.isThisOurTreeItem(current_item) == false &&
          visual_persistent.isThisOurTreeItem(current_item) == false)
        current_item = current_item.getParentItem();
      if (visual_persistent.isThisOurTreeItem(current_item)) return true;
    }
    return false;
  }
  */

  /**
   * Expands every nodes under a specified root node.
   * @param item root node.
   * @return void.
   */
  // GUI thread
  private void expandAll(final TreeItem item) {
    synchronized (sync_tree) {
      item.setExpanded(true);
      for (final TreeItem it : item.getItems()) expandAll(it);
    }
  }

  /**
   * Merges every nodes under a specified root node.
   * @param item root node.
   * @return void.
   */
  // GUI thread
  private void mergeAll(final TreeItem item) {
    synchronized (sync_tree) {
      item.setExpanded(false);
      for (final TreeItem it : item.getItems()) mergeAll(it);
    }
  }

  /**
   * Adds an action on every node under a specified root node.
   * @param item root node.
   * @param clazz action class.
   * @return void.
   */
  // GUI thread
  private void addActionAll(final TreeItem item, Class clazz) {
    synchronized (synchro) {
      synchronized (sync_tree) {
        final Session session = synchro.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        try  {
          for (final VisualElement elt : VisualElement.getSubElements(item, Target.class)) {
          final Target target = (Target) elt;

          boolean already_has_action = false;
          for (final VisualElement child : target.getChildren())
            if (clazz.isInstance(child)) {
              already_has_action = true;
              break;
            }

          if (already_has_action == false) {
            net.fenyo.gnetwatch.actions.Action action;
            try {
              action = (net.fenyo.gnetwatch.actions.Action) clazz.newInstance();
            } catch (final IllegalAccessException ex) {
              log.error("Exception", ex);
              return;
            } catch (final InstantiationException ex) {
              log.error("Exception", ex);
              return;
            }
            action.setTarget(target);
            action.setBackground(background);
            if (target.canManageThisChild(action))
              try {
                background.addActionQueue(action);
                action.setParent(this, target);
                session.save(action);
              } catch (final GeneralException ex) {
                log.error("Exception", ex);
              }
            }
          }

          session.getTransaction().commit();
        } catch (final Exception ex) {
          log.error("Exception", ex);
          session.getTransaction().rollback();
        }
      }
    }
  }

  /**
   * Adds a ping action on every nodes under a specified root node.
   * @param item root node.
   * @return void.
   */
  // GUI thread
  private void addPingAll(final TreeItem item) {
    addActionAll(item, ActionPing.class);
  }

  /**
   * Adds a process action on every nodes under a specified root node.
   * @param item root node.
   * @return void.
   */
  // GUI thread
  private void addProcessAll(final TreeItem item) {
    addActionAll(item, ActionGenericProcess.class);
  }

  /**
   * Adds a source action on every nodes under a specified root node.
   * @param item root node.
   * @return void.
   */
  // GUI thread
  private void addSourceAll(final TreeItem item) {
    addActionAll(item, ActionGenericSrc.class);
  }

  /**
   * Adds a flood action on every nodes under a specified root node.
   * @param item root node.
   * @return void.
   */
  // GUI thread
  private void addFloodAll(final TreeItem item) {
    addActionAll(item, ActionFlood.class);
  }

  /**
   * Adds a flood action on every nodes under a specified root node.
   * @param item root node.
   * @return void.
   */
  // GUI thread
  private void addHTTPAll(final TreeItem item) {
    addActionAll(item, ActionHTTP.class);
  }

  /**
   * Adds an "SNMP explore" action on every nodes under a specified root node.
   * @param item root node.
   * @return void.
   */
  // GUI thread
  private void exploreSNMP(final TreeItem item) {
    addActionAll(item, ActionSNMP.class);
  }

  /**
   * Adds an "nmap explore" action on every nodes under a specified root node.
   * @param item root node.
   * @return void.
   */
  // GUI thread
  private void exploreNmap(final TreeItem item) {
    addActionAll(item, ActionNmap.class);
  }

  /**
   * Synchronously get system descriptions via SNMP on every nodes under a specified root node.
   * @param item item root node.
   * @return void.
   */
  // GUI thread
  private void getSysdescr(final TreeItem item) {
    final TransientGUI tg = new TransientGUI();
    tg.begin();

    // ne pas faire ce synchronized (sync_tree) car trop long donc bug apparent si on d�place une fenetre de graphe par ex
//    XXX ICI BLOCAGE QD FENETRE DEFILEMENT ET POPUP LONGUE ATTENTE
    synchronized (sync_tree) {
      tg.setSize(VisualElement.getSubElements(item, TargetIPv4.class).size() +
          VisualElement.getSubElements(item, TargetIPv6.class).size());

      for (final VisualElement elt : VisualElement.getSubElements(item, TargetIPv4.class)) {
        if (tg.isFinished() == false) {
          tg.inc();

          final TargetIPv4 target = (TargetIPv4) elt;
          appendConsole("description[" + target.getAddress() + "]=\"" + target.getSNMPQuerier().getSysDescr() + "\"<BR/>");

          if (target.getSNMPQuerier().isSNMPCapable()) target.setImageHostSNMP();
          if (target.getSNMPQuerier().getLastSysdescr() != null) target.setType(target.getSNMPQuerier().getLastSysdescr());
        }
      }

      for (final VisualElement elt : VisualElement.getSubElements(item, TargetIPv6.class)) {
        if (tg.isFinished() == false) {
          tg.inc();

          final TargetIPv6 target = (TargetIPv6) elt;
          appendConsole("description[" + target.getAddress() + "]=\"" + target.getSNMPQuerier().getSysDescr() + "\"<BR/>");

          if (target.getSNMPQuerier().isSNMPCapable()) target.setImageHost6SNMP();
          if (target.getSNMPQuerier().getLastSysdescr() != null) target.setType(target.getSNMPQuerier().getLastSysdescr());
        }
      }
    }

    tg.end();
  }

  // GUI thread
  private void getGeneralInformation(final TreeItem item) {
    final TransientGUI tg = new TransientGUI();
    tg.begin();

    synchronized (sync_tree) {
      tg.setSize(VisualElement.getSubElements(item, TargetIPv4.class).size() +
          VisualElement.getSubElements(item, TargetIPv6.class).size());

      for (final VisualElement elt : VisualElement.getSubElements(item, TargetIPv4.class)) {
        if (tg.isFinished() == false) {
          tg.inc();

          final TargetIPv4 target = (TargetIPv4) elt;
          appendConsole(target.getSNMPQuerier().getGeneralInformation());
        }
      }
      for (final VisualElement elt : VisualElement.getSubElements(item, TargetIPv6.class)) {
        if (tg.isFinished() == false) {
          tg.inc();

          final TargetIPv6 target = (TargetIPv6) elt;
          appendConsole(target.getSNMPQuerier().getGeneralInformation());
        }
      }
    }

    tg.end();
  }

  // GUI thread
  private void getRoutingTable(final TreeItem item) {
    final TransientGUI tg = new TransientGUI();
    tg.begin();

    synchronized (sync_tree) {
      tg.setSize(VisualElement.getSubElements(item, TargetIPv4.class).size() +
          VisualElement.getSubElements(item, TargetIPv6.class).size());

      for (final VisualElement elt : VisualElement.getSubElements(item, TargetIPv4.class)) {
        if (tg.isFinished() == false) {
          tg.inc();

          final TargetIPv4 target = (TargetIPv4) elt;
          appendConsole(target.getSNMPQuerier().getRoutingTable(tg));
        }
      }
      for (final VisualElement elt : VisualElement.getSubElements(item, TargetIPv6.class)) {
        if (tg.isFinished() == false) {
          tg.inc();

          final TargetIPv6 target = (TargetIPv6) elt;
          appendConsole(target.getSNMPQuerier().getRoutingTable(tg));
        }
      }
    }

    tg.end();
  }

  // GUI thread
  private void getArpTable(final TreeItem item) {
    final TransientGUI tg = new TransientGUI();
    tg.begin();

    synchronized (sync_tree) {
      tg.setSize(VisualElement.getSubElements(item, TargetIPv4.class).size() +
          VisualElement.getSubElements(item, TargetIPv6.class).size());

      for (final VisualElement elt : VisualElement.getSubElements(item, TargetIPv4.class)) {
        if (tg.isFinished() == false) {
          tg.inc();

          final TargetIPv4 target = (TargetIPv4) elt;
          appendConsole(target.getSNMPQuerier().getArpTable(tg));
        }
      }
      for (final VisualElement elt : VisualElement.getSubElements(item, TargetIPv6.class)) {
        if (tg.isFinished() == false) {
          tg.inc();

          final TargetIPv6 target = (TargetIPv6) elt;
          appendConsole(target.getSNMPQuerier().getArpTable(tg));
        }
      }
    }

    tg.end();
  }

  // GUI thread
  private void getGenericTable(final TreeItem item, final String tablename,
      final String oid, final int oids[], final String names[], Object fields[][]) {
    final TransientGUI tg = new TransientGUI();
    tg.begin();

    synchronized (sync_tree) {
      tg.setSize(VisualElement.getSubElements(item, TargetIPv4.class).size() +
          VisualElement.getSubElements(item, TargetIPv6.class).size());

      for (final VisualElement elt : VisualElement.getSubElements(item, TargetIPv4.class)) {
        if (tg.isFinished() == false) {
          tg.inc();

          final TargetIPv4 target = (TargetIPv4) elt;
          appendConsole(target.getSNMPQuerier().getGenericTable(tg, tablename, oid, oids, names, fields));
        }
      }
      for (final VisualElement elt : VisualElement.getSubElements(item, TargetIPv6.class)) {
        if (tg.isFinished() == false) {
          tg.inc();

          final TargetIPv6 target = (TargetIPv6) elt;
          appendConsole(target.getSNMPQuerier().getGenericTable(tg, tablename, oid, oids, names, fields));
        }
      }
    }

    tg.end();
  }

  // GUI thread
  private void getMACTable(final TreeItem item) {
    final TransientGUI tg = new TransientGUI();
    tg.begin();

    synchronized (sync_tree) {
      tg.setSize(VisualElement.getSubElements(item, TargetIPv4.class).size() +
          VisualElement.getSubElements(item, TargetIPv6.class).size());

      for (final VisualElement elt : VisualElement.getSubElements(item, TargetIPv4.class)) {
        if (tg.isFinished() == false) {
          tg.inc();

          final TargetIPv4 target = (TargetIPv4) elt;
          appendConsole(target.getSNMPQuerier().getMACTable(tg));
        }
      }
      for (final VisualElement elt : VisualElement.getSubElements(item, TargetIPv6.class)) {
        if (tg.isFinished() == false) {
          tg.inc();

          final TargetIPv6 target = (TargetIPv6) elt;
          appendConsole(target.getSNMPQuerier().getMACTable(tg));
        }
      }
    }

    tg.end();
  }

  /**
   * Detaches every nodes under a specified root node.
   * @param item item root node.
   * @return void.
   */
  private void removeVisualElements(final TreeItem item) {
    synchronized (synchro) {
      synchronized (sync_tree) {
        final VisualElement visual_element = (VisualElement) item.getData(VisualElement.class.toString());
        if (item.getParentItem() == null) return;
        final VisualElement visual_parent = (VisualElement) item.getParentItem().getData(VisualElement.class.toString());

        final Session session = synchro.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        try {
          visual_element.removeVisualElements(visual_parent);
          session.getTransaction().commit();
        } catch (final Exception ex) {
          log.error("Exception", ex);
          session.getTransaction().rollback();
        }
      }
    }
  }

  /**
   * Detaches action or view nodes under a specified root node.
   * @param item item root node.
   * @return void.
   */
  private void removeActionOrView(final TreeItem item, final Class clazz) {
    synchronized (synchro) {
      synchronized (sync_tree) {
        final Session session = synchro.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        try  {
          for (final VisualElement action : VisualElement.getSubElements(item, clazz))
            if (action.getParents().size() == 1)
              action.removeVisualElements(action.getParents().get(0));
          session.getTransaction().commit();
        } catch (final Exception ex) {
          log.error("Exception", ex);
          session.getTransaction().rollback();
        }
      }
    }
  }

  /**
   * Detaches action nodes under a specified root node.
   * @param item item root node.
   * @return void.
   */
  private void removeActions(final TreeItem item) {
    removeActionOrView(item, net.fenyo.gnetwatch.actions.Action.class);
  }

  /**
   * Detaches ping actions under a specified root node.
   * @param item item root node.
   * @return void.
   */
  private void removeActionsPing(final TreeItem item) {
    removeActionOrView(item, ActionPing.class);
  }

  /**
   * Detaches flood actions under a specified root node.
   * @param item item root node.
   * @return void.
   */
  private void removeActionsFlood(final TreeItem item) {
    removeActionOrView(item, ActionFlood.class);
  }

  /**
   * Detaches "SNMP explore" actions under a specified root node.
   * @param item item root node.
   * @return void.
   */
  private void removeActionsExplore(final TreeItem item) {
    removeActionOrView(item, ActionSNMP.class);
  }

  /**
   * Detaches every views under a specified root node.
   * @param item item root node.
   * @return void.
   */
  private void removeViews(final TreeItem item) {
    removeActionOrView(item, DataView.class);
  }

  /**
   * Detaches ping views under a specified root node.
   * @param item item root node.
   * @return void.
   */
  private void removeViewsPing(final TreeItem item) {
    removeActionOrView(item, ReachableView.class);
  }

  /**
   * Detaches flood views under a specified root node.
   * @param item item root node.
   * @return void.
   */
  private void removeViewsFlood(final TreeItem item) {
    removeActionOrView(item, FloodView.class);
  }

  /**
   * Detaches "SNMP explore" views under a specified root node.
   * @param item item root node.
   * @return void.
   */
  private void removeViewsExplore(final TreeItem item) {
    removeActionOrView(item, BytesReceivedView.class);
    removeActionOrView(item, BytesSentView.class);
  }

  /**
   * Creates a new target or attaches an existing one to the current position.
   * @param target target.
   * @return boolean true if the target has been created or attached.
   */
  // GUI thread
  // appel� par boutons sur la gauche pour ts types de targets
  // utilise la selection courante
  // lock survey : sync_tree << synchro << HERE
  private boolean addTargetAtCurrentPosition(final Target target) {
    if (tree.getSelectionCount() == 1 &&
        (/* isSelectionPersistent() || */ isSelectionTransient())) {
      final VisualElement parent = (VisualElement) tree.getSelection()[0].getData(VisualElement.class.toString());
      if (parent != null && Target.class.isInstance(parent)) return target.addTarget(this, (Target) parent);
      else log.error("can not add a target under a null or non target parent: " + parent);
    }
    return false;
  }

  /**
   * Terminates the application.
   * @param none.
   * @return void.
   */
  // only called in the SWT thread
  private void exitApplication() {
    shell.close();
  }

  private void appendNetworkInterfaces() {
    try {
      // should be localized
      String str = "<HR/><B>Local network interfaces</B>";
      str += "<TABLE BORDER='0' BGCOLOR='black' cellspacing='1' cellpadding='1'>";
      for (final Enumeration nifs = NetworkInterface.getNetworkInterfaces(); nifs.hasMoreElements(); ) {
        final NetworkInterface nif = (NetworkInterface) nifs.nextElement();
        str += "<TR><TD bgcolor='lightyellow' align='right'><B>" + htmlFace("interface name") + "</B></TD><TD bgcolor='lightyellow'><B>" + htmlFace(nif.getName())+ "</B></TD></TR>";
        str += "<TR><TD bgcolor='lightyellow' align='right'>" + htmlFace("display name") + "</TD><TD bgcolor='lightyellow'>" + htmlFace(nif.getDisplayName())+ "</TD></TR>";
        for (final Enumeration addrs = nif.getInetAddresses(); addrs.hasMoreElements(); ) {
          final InetAddress addr = (InetAddress) addrs.nextElement();
          if (Inet4Address.class.isInstance(addr))
            str += "<TR><TD bgcolor='lightyellow' align='right'>" + htmlFace("IPv4 address") + "</TD><TD bgcolor='lightyellow'>" + htmlFace(addr.getHostAddress()) + "</TD></TR>";
          if (Inet6Address.class.isInstance(addr))
            str += "<TR><TD bgcolor='lightyellow' align='right'>" + htmlFace("IPv6 address") + "</TD><TD bgcolor='lightyellow'>" + htmlFace(addr.getHostAddress()) + "</TD></TR>";
        }
      }
      str += "</TABLE>";
      appendConsole(str);
    } catch (final SocketException ex) {
      log.error("Exception", ex);
    }
  }

  private void appendDatabaseStatistics() {
    synchronized (synchro) {
      // should be localized
      String str = "<HR/><B>Database statistics</B><BR/>";

      Session session = getSynchro().getSessionFactory().getCurrentSession();
      session.beginTransaction();
      try {
        Integer count = (Integer) session.createQuery("select count(*) from EventGeneric").uniqueResult();
        str += "total number of events: " + count + "<BR/>";
        count = (Integer) session.createQuery("select count(*) from Target").uniqueResult();
        str += "total number of targets: " + count + "<BR/>";

        session.getTransaction().commit();

        appendConsole(str);
      } catch (final Exception ex) {
        log.error("Exception", ex);
        session.getTransaction().rollback();
      }
    }

    synchronized (synchro) {
      synchronized (sync_tree) {
        final Session session = synchro.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        try  {
          // should be localized
          String str = "<TABLE BORDER='0' BGCOLOR='black' cellspacing='1' cellpadding='1'>" +
          "<TR><TD bgcolor='lightyellow' align='left'><B>" + htmlFace("target") + "</B></TD>" +
          "<TD bgcolor='lightyellow' align='left'><B>" + htmlFace("class") + "</B></TD>" +
          "<TD bgcolor='lightyellow' align='right'><B>" + htmlFace("events") + "</B></TD></TR>";
          for (final VisualElement elt : visual_transient.getSubElements(Target.class)) {
            final Target target = (Target) elt;
            session.update(target);
            for (final String event_type : target.getEventLists().keySet()) {
              final Integer count = (Integer) session.createQuery("select count(*) from EventGeneric ev " +
                  "where ev.eventList = :event_list")
                  .setString("event_list", target.getEventLists().get(event_type).getId().toString()).uniqueResult();

              str += "<TR><TD bgcolor='lightyellow' align='left'>"
                + htmlFace((TargetInterface.class.isInstance(target) ? target.getParents().get(0).getItem() + ": " : "") + target.getItem()) +
              "</TD><TD bgcolor='lightyellow' align='left'>"
                + htmlFace(event_type.replaceAll(".*\\.", "")) + "</TD>" +
              "<TD bgcolor='lightyellow' align='right'>" + htmlFace("" + count)+ "</TD></TR>";
            }
          }

          session.getTransaction().commit();

          str += "</TABLE>";
          appendConsole(str);
        } catch (final Exception ex) {
          log.error("Exception", ex);
          session.getTransaction().rollback();
        }
      }
    }
  }

  /**
   * Instanciates the GUI objects.
   * GUI thread.
   * @param none.
   * @return void.
   */
  private void createGUI() throws UnknownHostException, SocketException, AlgorithmException {
    final GUI gui = this;

    synchronized (sync_tree) {

    display = new Display();
    shell = new Shell(display);
    shell.setText(getConfig().getString("version"));

    // Shell Layout
    layout = new GridLayout();
    layout.numColumns = 1;
    layout.marginHeight = 2;
    layout.marginWidth = 2;
    layout.verticalSpacing = 1;
    shell.setLayout(layout);
    // shell.setBackground(display.getSystemColor(SWT.COLOR_BLUE));

    // Menu
    menu_bar = new Menu(shell, SWT.BAR);
    shell.setMenuBar(menu_bar);

    // Menu "File"
    menu_file = new Menu(shell, SWT.DROP_DOWN);
    menu_item_file = new MenuItem(menu_bar, SWT.CASCADE);
    menu_item_file.setText(getConfig().getString("menu_file"));
    menu_item_file.setMenu(menu_file);

    // Menu "file": MenuItem "Merge events now"
    menu_item_merge_now = new MenuItem(menu_file, SWT.PUSH);
    menu_item_merge_now.setText(getConfig().getString("menu_merge_events_now"));
    menu_item_merge_now.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        background.getMergeQueue().informCycle();
     }
    });

    new MenuItem(menu_file, SWT.SEPARATOR);

    // Menu "file": MenuItem "Exit"
    menu_item_exit = new MenuItem(menu_file, SWT.PUSH);
    menu_item_exit.setText(getConfig().getString("menu_exit"));
    menu_item_exit.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        gui.exitApplication();
      }
    });
    menu_item_exit.setImage(new Image(display, "pictures/exit.png"));

    // Menu "Discover"
    final Menu menu_discover = new Menu(shell, SWT.DROP_DOWN);
    final MenuItem menu_item_discover = new MenuItem(menu_bar, SWT.CASCADE);
    menu_item_discover.setText(getConfig().getString("menu_discover"));
    menu_item_discover.setMenu(menu_discover);

    // Menu "Discover": MenuItem "Start" and "Stop"
    final MenuItem menu_item_discover_start = new MenuItem(menu_discover, SWT.PUSH);
    final MenuItem menu_item_discover_stop = new MenuItem(menu_discover, SWT.PUSH);
    menu_item_discover_start.setText(getConfig().getString("menu_start"));
    menu_item_discover_start.setImage(new Image(display, "pictures/exec.png"));
    menu_item_discover_stop.setText(getConfig().getString("menu_stop"));
    menu_item_discover_stop.setImage(new Image(display, "pictures/fileclose.png"));
    menu_item_discover_stop.setEnabled(false);
    menu_item_discover_start.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_discover_start.setEnabled(false);
        item_discover_start.setEnabled(false);
        main.startDiscover();
        menu_item_discover_stop.setEnabled(true);
        item_discover_stop.setEnabled(true);
      }
    });
    menu_item_discover_stop.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_discover_start.setEnabled(true);
        item_discover_start.setEnabled(true);
        main.stopDiscover();
        menu_item_discover_stop.setEnabled(false);
        item_discover_stop.setEnabled(false);
      }
    });

    // Menu "Tree"
    final Menu menu_tree = new Menu(shell, SWT.DROP_DOWN);
    final MenuItem menu_item_tree = new MenuItem(menu_bar, SWT.CASCADE);
    menu_item_tree.setText(getConfig().getString("menu_tree"));
    menu_item_tree.setMenu(menu_tree);


    // Menu "Tree": MenuItem "Expand"
    final MenuItem menu_item_expand = new MenuItem(menu_tree, SWT.PUSH);
    menu_item_expand.setText(getConfig().getString("expand"));
    menu_item_expand.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        if (tree.getSelectionCount() == 1) tree.getSelection()[0].setExpanded(true);
      }
    });

    // Menu "Tree": MenuItem "Merge"
    final MenuItem menu_item_merge = new MenuItem(menu_tree, SWT.PUSH);
    menu_item_merge.setText(getConfig().getString("collapse"));
    menu_item_merge.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        if (tree.getSelectionCount() == 1) tree.getSelection()[0].setExpanded(false);
      }
    });

    new MenuItem(menu_tree, SWT.SEPARATOR);

    // Menu "Tree": MenuItem "Expand All"
    final MenuItem menu_item_expand_all = new MenuItem(menu_tree, SWT.PUSH);
    menu_item_expand_all.setText(getConfig().getString("menu_expand_all"));
    menu_item_expand_all.setImage(new Image(display, "pictures/show_table_column.png"));
    menu_item_expand_all.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        if (tree.getSelectionCount() == 1) expandAll(tree.getSelection()[0]);
      }
    });

    // Menu "Tree": MenuItem "Merge All"
    final MenuItem menu_item_merge_all = new MenuItem(menu_tree, SWT.PUSH);
    menu_item_merge_all.setText(getConfig().getString("menu_collapse_all"));
    menu_item_merge_all.setImage(new Image(display, "pictures/hide_table_column.png"));
    menu_item_merge_all.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        if (tree.getSelectionCount() == 1) mergeAll(tree.getSelection()[0]);
      }
    });

    // Menu "Target"
    final Menu menu_target = new Menu(shell, SWT.DROP_DOWN);
    final MenuItem menu_item_target = new MenuItem(menu_bar, SWT.CASCADE);
    menu_item_target.setText(getConfig().getString("menu_target"));
    menu_item_target.setMenu(menu_target);

    // Menu "Target": MenuItem "Set Credentials"
    menu_item_credentials = new MenuItem(menu_target, SWT.PUSH);
    menu_item_credentials.setText(getConfig().getString("menu_set_credentials"));
    menu_item_credentials.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        final SNMPQuerier querier;

        synchronized (sync_tree) {
          if (tree.getSelectionCount() == 1 &&
              (/* isSelectionPersistent() || */ isSelectionTransient())) {
            final VisualElement target = (VisualElement) tree.getSelection()[0].getData(VisualElement.class.toString());

            if (target != null && (TargetIPv4.class.isInstance(target) || TargetIPv6.class.isInstance(target))) {
              if (TargetIPv4.class.isInstance(target)) querier = ((TargetIPv4) target).getSNMPQuerier();
              else querier = ((TargetIPv6) target).getSNMPQuerier();
            } else return;
          } else return;
        }

        final int version = querier.getVersion();
        final int sec = querier.getSec();
        final int port_src = querier.getRetries();
        final int timeout = querier.getTimeout();
        final int port = querier.getPort();
        final String community = querier.getCommunity();
        final String username = querier.getUsername();
        final String password_auth = querier.getPasswordAuth();
        final String password_priv = querier.getPasswordPriv();
        final int pdu_max_size = querier.getPDUMaxSize();

        final DialogCredentials dialog = new DialogCredentials(gui, shell);
        dialog.setVersion(version);
        dialog.setSec(sec);
        dialog.setRetries(port_src);
        dialog.setTimeout(timeout);
        dialog.setPort(port);
        dialog.setCommunity(community);
        dialog.setUsername(username);
        dialog.setPasswordAuth(password_auth);
        dialog.setPasswordPriv(password_priv);
        dialog.setPDUMaxSize(pdu_max_size);

        dialog.open();

        synchronized (synchro) {
          synchronized (sync_tree) {
            final Session session = synchro.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            try  {
              session.update(querier);
              if (dialog.getVersion() != version) querier.setVersion(dialog.getVersion());
              if (dialog.getSec() != sec) querier.setSec(dialog.getSec());
              if (dialog.getRetries() != port_src) querier.setRetries(dialog.getRetries());
              if (dialog.getTimeout() != timeout) querier.setTimeout(dialog.getTimeout());
              if (dialog.getPort() != port) querier.setPort(dialog.getPort());
              if (dialog.getCommunity() != community) querier.setCommunity(dialog.getCommunity());
              if (dialog.getUsername() != username) querier.setUsername(dialog.getUsername());
              if (dialog.getPasswordAuth() != password_auth) querier.setPasswordAuth(dialog.getPasswordAuth());
              if (dialog.getPasswordPriv() != password_priv) querier.setPasswordPriv(dialog.getPasswordPriv());
              if (dialog.getPDUMaxSize() != pdu_max_size) querier.setPDUMaxSize(dialog.getPDUMaxSize());
              querier.update();
              session.getTransaction().commit();
            } catch (final Exception ex) {
              log.error("Exception", ex);
              session.getTransaction().rollback();
            }
          }
        }
      }
    });

    // Menu "Target": MenuItem "Set IP options"
    menu_item_ip_options = new MenuItem(menu_target, SWT.PUSH);
    menu_item_ip_options.setText(getConfig().getString("menu_set_ip_options"));
    menu_item_ip_options.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        final IPQuerier querier;

        synchronized (sync_tree) {
          if (tree.getSelectionCount() == 1 &&
              (/* isSelectionPersistent() || */ isSelectionTransient())) {
            final VisualElement target = (VisualElement) tree.getSelection()[0].getData(VisualElement.class.toString());

            if (target != null && (TargetIPv4.class.isInstance(target) || TargetIPv6.class.isInstance(target))) {
              if (TargetIPv4.class.isInstance(target)) querier = ((TargetIPv4) target).getIPQuerier();
              else querier = ((TargetIPv6) target).getIPQuerier();
            } else return;
          } else return;
        }

        final int tos = querier.getTos();
        final int port_src = querier.getPortSrc();
        final int port_dst = querier.getPortDst();
        final int pdu_max_size = querier.getPDUMaxSize();

        final DialogIPOptions dialog = new DialogIPOptions(gui, shell);

        dialog.setTOS(tos);
        dialog.setPortSrc(port_src);
        dialog.setPortDst(port_dst);
        dialog.setPDUMaxSize(pdu_max_size);

        dialog.open();

        synchronized (synchro) {
          synchronized (sync_tree) {
            final Session session = synchro.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            try  {
              session.update(querier);
              if (dialog.getTOS() != tos) querier.setTos(dialog.getTOS());
              if (dialog.getPortSrc() != port_src) querier.setPortSrc(dialog.getPortSrc());
              if (dialog.getPortDst() != port_dst) querier.setPortDst(dialog.getPortDst());
              if (dialog.getPDUMaxSize() != pdu_max_size) querier.setPDUMaxSize(dialog.getPDUMaxSize());
              querier.update();
              session.getTransaction().commit();
            } catch (final Exception ex) {
              log.error("Exception", ex);
              session.getTransaction().rollback();
            }
          }
        }
      }
    });

    // Menu "Target": MenuItem "Set HTTP/FTP options"
    menu_item_http_options = new MenuItem(menu_target, SWT.PUSH);
    menu_item_http_options.setText(getConfig().getString("menu_set_http_options"));
    menu_item_http_options.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        final IPQuerier querier;

        synchronized (sync_tree) {
          if (tree.getSelectionCount() == 1 &&
              (/* isSelectionPersistent() || */ isSelectionTransient())) {
            final VisualElement target = (VisualElement) tree.getSelection()[0].getData(VisualElement.class.toString());

            if (target != null && (TargetIPv4.class.isInstance(target) || TargetIPv6.class.isInstance(target))) {
              if (TargetIPv4.class.isInstance(target)) querier = ((TargetIPv4) target).getIPQuerier();
              else querier = ((TargetIPv6) target).getIPQuerier();
            } else return;
          } else return;
        }

        final int nparallel = querier.getNParallel();
        final String proxy_host = querier.getProxyHost();
        final int proxy_port = querier.getProxyPort();
        final String URL = querier.getURL();
//        final boolean reconnect = querier.getReconnect();
        final boolean use_proxy = querier.getUseProxy();

        final DialogHTTPOptions dialog = new DialogHTTPOptions(gui, shell);

        dialog.setNParallel(nparallel);
        dialog.setProxyHost(proxy_host);
        dialog.setProxyPort(proxy_port);
        dialog.setURL(URL);
//        dialog.setReconnect(reconnect);
        dialog.setUseProxy(use_proxy);

        dialog.open();

        synchronized (synchro) {
          synchronized (sync_tree) {
            final Session session = synchro.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            try  {
              session.update(querier);
              if (dialog.getNParallel() != nparallel) querier.setNParallel(dialog.getNParallel());
              if (dialog.getProxyHost() != proxy_host) querier.setProxyHost(dialog.getProxyHost());
              if (dialog.getProxyPort() != proxy_port) querier.setProxyPort(dialog.getProxyPort());
              if (dialog.getURL() != URL) querier.setURL(dialog.getURL());
//              if (dialog.getReconnect() != reconnect) querier.setReconnect(dialog.getReconnect());
              if (dialog.getUseProxy() != use_proxy) querier.setUseProxy(dialog.getUseProxy());
              querier.update();
              session.getTransaction().commit();
            } catch (final Exception ex) {
              log.error("Exception", ex);
              session.getTransaction().rollback();
            }
          }
        }
      }
    });

    // Menu "Target": MenuItem "Set generic options"
    menu_item_generic_options = new MenuItem(menu_target, SWT.PUSH);
    menu_item_generic_options.setText(getConfig().getString("menu_set_generic_options"));
    menu_item_generic_options.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        final GenericQuerier querier;

        synchronized (sync_tree) {
          if (tree.getSelectionCount() == 1 &&
              (/* isSelectionPersistent() || */ isSelectionTransient())) {
            final VisualElement target = (VisualElement) tree.getSelection()[0].getData(VisualElement.class.toString());

            if (target != null && TargetGroup.class.isInstance(target)) {
              querier = ((TargetGroup) target).getGenericQuerier();
            } else return;
          } else return;
        }

        final String title = querier.getTitle();
        final String cmdline = querier.getCommandLine();
        final String workdir = querier.getWorkingDirectory();
        final String filename = querier.getFileName();
        final String unit = querier.getUnit();

        final DialogGeneric dialog = new DialogGeneric(gui, shell);

        dialog.setTitle(title);
        dialog.setCommandLine(cmdline);
        dialog.setWorkdir(workdir);
        dialog.setFilename(filename);
        dialog.setUnit(unit);

        dialog.open();

        if (dialog.isOK()) synchronized (synchro) {
          synchronized (sync_tree) {
            final Session session = synchro.getSessionFactory().getCurrentSession();
            session.beginTransaction();

            try {
              session.update(querier);
              if (dialog.getTitle() != title) querier.setTitle(dialog.getTitle());
              if (dialog.getCommandLine() != cmdline) querier.setCommandLine(dialog.getCommandLine());
              if (dialog.getWorkdir() != workdir) querier.setWorkingDirectory(dialog.getWorkdir());
              if (dialog.getFilename() != filename) querier.setFileName(dialog.getFilename());
              if (dialog.getUnit() != unit) querier.setUnit(dialog.getUnit());

              session.getTransaction().commit();
            } catch (final Exception ex) {
              log.error("Exception", ex);
              session.getTransaction().rollback();
            }
          }
        }
      }
    });

    new MenuItem(menu_target, SWT.SEPARATOR);

    // Menu "Target": MenuItem "Add IPv4 Host"
    menu_item_add_host = new MenuItem(menu_target, SWT.PUSH);
    menu_item_add_host.setText(getConfig().getString("menu_add_ipv4"));
    menu_item_add_host.setImage(new Image(display, "pictures/network_local.png"));
    menu_item_add_host.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        target_host_push.notifyListeners(SWT.Selection, e);
      }
    });

    // Menu "Target": MenuItem "Add IPv6 Host"
    menu_item_add_host6 = new MenuItem(menu_target, SWT.PUSH);
    menu_item_add_host6.setText(getConfig().getString("menu_add_ipv6"));
    menu_item_add_host6.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        target_host6_push.notifyListeners(SWT.Selection, e);
      }
    });

    // Menu "Target": MenuItem "Add Range"
    menu_item_add_range = new MenuItem(menu_target, SWT.PUSH);
    menu_item_add_range.setText(getConfig().getString("menu_add_range"));
    menu_item_add_range.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        target_range_push.notifyListeners(SWT.Selection, e);
      }
    });

    // Menu "Target": MenuItem "Add Network"
    menu_item_add_network = new MenuItem(menu_target, SWT.PUSH);
    menu_item_add_network.setText(getConfig().getString("menu_add_network"));
    menu_item_add_network.setImage(new Image(display, "pictures/network.png"));
    menu_item_add_network.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        target_subnet_push.notifyListeners(SWT.Selection, e);
      }
    });

    // Menu "Target": MenuItem "Add Group"
    menu_item_add_group = new MenuItem(menu_target, SWT.PUSH);
    menu_item_add_group.setText(getConfig().getString("menu_add_group"));
    menu_item_add_group.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        target_group_push.notifyListeners(SWT.Selection, e);
      }
    });

    new MenuItem(menu_target, SWT.SEPARATOR);

    // Menu "Target": MenuItem "Remove Element"
    menu_item_remove_target = new MenuItem(menu_target, SWT.PUSH);
    menu_item_remove_target.setText(getConfig().getString("menu_remove_element"));
    menu_item_remove_target.setImage(new Image(display, "pictures/nomailappt.png"));
    menu_item_remove_target.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        if (tree.getSelectionCount() == 1) removeVisualElements(tree.getSelection()[0]);
      }
    });

    // Menu "Action"
    final Menu menu_action = new Menu(shell, SWT.DROP_DOWN);
    final MenuItem menu_item_action = new MenuItem(menu_bar, SWT.CASCADE);
    menu_item_action.setText(getConfig().getString("menu_action"));
    menu_item_action.setMenu(menu_action);

/*
    // Menu "Action": MenuItem "Sysdescr"
    final MenuItem menu_item_sysdescr = new MenuItem(menu_action, SWT.PUSH);
    menu_item_sysdescr.setText(getConfig().getString("menu_get_system_description"));
    menu_item_sysdescr.setImage(new Image(display, "pictures/yahoo_idle-af.png"));
    menu_item_sysdescr.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1) getSysdescr(tree.getSelection()[0]);
        }
    });
*/

    // Menu "Action": MenuItem "Add Ping"
    menu_item_add_ping = new MenuItem(menu_action, SWT.PUSH);
    menu_item_add_ping.setText(getConfig().getString("menu_ping_target"));
    menu_item_add_ping.setImage(new Image(display, "pictures/yahoo_idle-af.png"));
    menu_item_add_ping.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1) addPingAll(tree.getSelection()[0]);
      }
    });

    // Menu "Action": MenuItem "Add Generic Process"
    menu_item_add_process = new MenuItem(menu_action, SWT.PUSH);
    menu_item_add_process.setText(getConfig().getString("menu_generic_process"));
    menu_item_add_process.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1) addProcessAll(tree.getSelection()[0]);
      }
    });

    // Menu "Action": MenuItem "Add Generic Source"
    menu_item_add_source = new MenuItem(menu_action, SWT.PUSH);
    menu_item_add_source.setText(getConfig().getString("menu_generic_source"));
    menu_item_add_source.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1) addSourceAll(tree.getSelection()[0]);
      }
    });

    // Menu "Action": MenuItem "Add Flood"
    menu_item_add_flood = new MenuItem(menu_action, SWT.PUSH);
    menu_item_add_flood.setText(getConfig().getString("menu_flood_target"));
    menu_item_add_flood.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1) addFloodAll(tree.getSelection()[0]);
      }
    });

    // Menu "Action": MenuItem "Add Flood"
    menu_item_add_http = new MenuItem(menu_action, SWT.PUSH);
    menu_item_add_http.setText(getConfig().getString("menu_http_target"));
    menu_item_add_http.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1) addHTTPAll(tree.getSelection()[0]);
      }
    });

    // Menu "Action": MenuItem "Explore via SNMP"
    menu_item_explore_snmp = new MenuItem(menu_action, SWT.PUSH);
    menu_item_explore_snmp.setText(getConfig().getString("menu_explore_via_snmp"));
    menu_item_explore_snmp.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1) exploreSNMP(tree.getSelection()[0]);
      }
    });

    // Menu "Action": MenuItem "Explore via Nmap"
    menu_item_explore_nmap = new MenuItem(menu_action, SWT.PUSH);
    menu_item_explore_nmap.setText(getConfig().getString("menu_explore_via_nmap"));
    menu_item_explore_nmap.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1) exploreNmap(tree.getSelection()[0]);
      }
    });

    new MenuItem(menu_action, SWT.SEPARATOR);

    // Menu "Action": MenuItem "Drop Action"
    menu_item_remove_action = new MenuItem(menu_action, SWT.PUSH);
    menu_item_remove_action.setText(getConfig().getString("menu_drop_action"));
    menu_item_remove_action.setImage(new Image(display, "pictures/button_cancel-af.png"));
    menu_item_remove_action.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        if (tree.getSelectionCount() == 1) removeActions(tree.getSelection()[0]);
      }
    });

    // Menu "Action": MenuItem "Drop Action Ping"
    menu_item_remove_action_ping = new MenuItem(menu_action, SWT.PUSH);
    menu_item_remove_action_ping.setText(getConfig().getString("menu_drop_action_ping"));
    menu_item_remove_action_ping.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        if (tree.getSelectionCount() == 1) removeActionsPing(tree.getSelection()[0]);
      }
    });

    // Menu "Action": MenuItem "Drop Action Flood"
    menu_item_remove_action_flood = new MenuItem(menu_action, SWT.PUSH);
    menu_item_remove_action_flood.setText(getConfig().getString("menu_drop_action_flood"));
    menu_item_remove_action_flood.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        if (tree.getSelectionCount() == 1) removeActionsFlood(tree.getSelection()[0]);
      }
    });

    // Menu "Action": MenuItem "Drop Action Explore"
    menu_item_remove_action_explore = new MenuItem(menu_action, SWT.PUSH);
    menu_item_remove_action_explore.setText(getConfig().getString("menu_drop_action_explore"));
    menu_item_remove_action_explore.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        if (tree.getSelectionCount() == 1) removeActionsExplore(tree.getSelection()[0]);
      }
    });

    new MenuItem(menu_action, SWT.SEPARATOR);

    // Menu "Action": MenuItem "Drop View"
    menu_item_remove_view = new MenuItem(menu_action, SWT.PUSH);
    menu_item_remove_view.setText(getConfig().getString("menu_drop_view"));
    menu_item_remove_view.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        if (tree.getSelectionCount() == 1) removeViews(tree.getSelection()[0]);
      }
    });

    // Menu "Action": MenuItem "Drop View Ping"
    menu_item_remove_view_ping = new MenuItem(menu_action, SWT.PUSH);
    menu_item_remove_view_ping.setText(getConfig().getString("menu_drop_view_ping"));
    menu_item_remove_view_ping.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        if (tree.getSelectionCount() == 1) removeViewsPing(tree.getSelection()[0]);
      }
    });

    // Menu "Action": MenuItem "Drop View Flood"
    menu_item_remove_view_flood = new MenuItem(menu_action, SWT.PUSH);
    menu_item_remove_view_flood.setText(getConfig().getString("menu_drop_view_flood"));
    menu_item_remove_view_flood.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        if (tree.getSelectionCount() == 1) removeViewsFlood(tree.getSelection()[0]);
      }
    });

    // Menu "Action": MenuItem "Drop View Explore"
    menu_item_remove_view_explore = new MenuItem(menu_action, SWT.PUSH);
    menu_item_remove_view_explore.setText(getConfig().getString("menu_drop_view_explore"));
    menu_item_remove_view_explore.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        if (tree.getSelectionCount() == 1) removeViewsExplore(tree.getSelection()[0]);
      }
    });

    // Menu "View"
    final Menu menu_view = new Menu(shell, SWT.DROP_DOWN);
    final MenuItem menu_item_view = new MenuItem(menu_bar, SWT.CASCADE);
    menu_item_view.setText(getConfig().getString("menu_snmp_info"));
    menu_item_view.setMenu(menu_view);

    // Menu "View": MenuItem "Get SysDescr"
    final MenuItem menu_item_open_view = new MenuItem(menu_view, SWT.PUSH);
    menu_item_open_view.setText(getConfig().getString("menu_get_system_description"));
    menu_item_open_view.setImage(new Image(display, "pictures/multirow.png"));
    menu_item_open_view.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1) getSysdescr(tree.getSelection()[0]);
        }
    });

    // Menu "View": MenuItem "Get General Information"
    final MenuItem menu_item_get_general_information = new MenuItem(menu_view, SWT.PUSH);
    menu_item_get_general_information.setText(getConfig().getString("menu_get_general_information"));
    menu_item_get_general_information.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1) getGeneralInformation(tree.getSelection()[0]);
        }
    });

    // Menu "View": MenuItem "Get Routing Table"
    final MenuItem menu_item_get_routing_table = new MenuItem(menu_view, SWT.PUSH);
    menu_item_get_routing_table.setText(getConfig().getString("menu_get_routing_table"));
    menu_item_get_routing_table.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        // if (tree.getSelectionCount() == 1) getRoutingTable(tree.getSelection()[0]);
        if (tree.getSelectionCount() == 1)
          getGenericTable(tree.getSelection()[0],
            "route",
            "1.3.6.1.2.1.4.21.1",
            new int [] {9, 1, 11, 2, 7, 8, 10, 3, 4, 5, 6, 12, 13},
            new String [] {"proto", "destination", "netmask", "interface", "next hop",
            "type", "age", "metric1", "metric2", "metric3", "metric4", "metric5", "info"},
            new Object [][] {
              {0, "gnetwatch error", "other", "local",
                "netmgmt", "icmp", "egp", "ggp", "hello", "rip", "is-is", "es-is",
                "ciscoIgrp", "bbnSpfIgp", "ospf", "bgp"},
              {5, "gnetwatch error", "other", "invalid",
                "direct", "indirect"},
              {3}
            });
        }
    });

    // Menu "View": MenuItem "Get Arp Table"
    final MenuItem menu_item_get_arp_table = new MenuItem(menu_view, SWT.PUSH);
    menu_item_get_arp_table.setText(getConfig().getString("menu_get_arp_table"));
    menu_item_get_arp_table.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1) getArpTable(tree.getSelection()[0]);
        }
    });

    // Menu "View": MenuItem "Get Interfaces Table"
    final MenuItem menu_item_get_ifs_table = new MenuItem(menu_view, SWT.PUSH);
    menu_item_get_ifs_table.setText(getConfig().getString("menu_get_ifs_table"));
    menu_item_get_ifs_table.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      // snmptranslate -Td IF-MIB::ifMtu
      // ::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) interfaces(2) ifTable(2) ifEntry(1) 4 }
      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1)
          getGenericTable(tree.getSelection()[0],
            "interface",
            "1.3.6.1.2.1.2.2.1",
            // echo {1..22} | sed 's/ /, /g'
            new int [] {1, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22},
            // res.txt : d�finition de ifEntry
            // echo `cat res.txt | grep -v ',' | grep if | sed 's/ */"/' | sed 's/$/"/'` | sed 's/ /, /g'
            new String [] {"ifIndex", "ifDescr", "ifType", "ifMtu", "ifSpeed", "ifPhysAddress",
            "ifAdminStatus", "ifOperStatus", "ifLastChange", "ifInOctets", "ifInUcastPkts",
            "ifInNUcastPkts", "ifInDiscards", "ifInErrors", "ifInUnknownProtos", "ifOutOctets",
            "ifOutUcastPkts", "ifOutNUcastPkts", "ifOutDiscards", "ifOutErrors", "ifOutQLen", "ifSpecific"},
            new Object [][] {
              {1},
              // type.txt : d�finition de ifType
              // echo `cat type.txt | fgrep '(' | sed 's/ *//' | sed 's/(.*/"/' | sed 's/^/"/'` | sed 's/ /, /g'
              // et rajouter "gnetwatch error" au d�but
              // if Type ::= { ifEntry 3 }
              {2, "gnetwatch error", "other", "regular1822", "hdh1822", "ddn-x25",
                "rfc877-x25", "ethernet-csmacd", "iso88023-csmacd", "iso88024-tokenBus",
                "iso88025-tokenRing", "iso88026-man", "starLan", "proteon-10Mbit",
                "proteon-80Mbit", "hyperchannel", "fddi", "lapb", "sdlc", "ds1",
                "e1", "basicISDN", "primaryISDN", "propPointToPointSerial", "ppp",
                "softwareLoopback", "eon", "ethernet-3Mbit", "nsip", "slip", "ultra",
                "ds3", "sip", "frame-relay"},
              {6, "gnetwatch error", "up", "down", "testing"},
              {7, "gnetwatch error", "up", "down", "testing"}
            });
      }
    });

    // Menu "View": MenuItem "Get .3 Stats Table"
    final MenuItem menu_item_get_dot3stats_table = new MenuItem(menu_view, SWT.PUSH);
    menu_item_get_dot3stats_table.setText(getConfig().getString("menu_get_dot3stats_table"));
    menu_item_get_dot3stats_table.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      // snmptranslate -m ALL -M"/usr/share/snmp/mibs:$HOME/MIBs/Cisco:$HOME/MIBS/3Com" -Td ETHERLIKE-MIB::dot3StatsDuplexStatus 2> /dev/null
      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1)
          getGenericTable(tree.getSelection()[0],
            "Ethernet",
            "1.3.6.1.2.1.10.7.2.1",
            new int [] {1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 16, 18, 19, 20, 21},
            // res.txt : d�finition de ifEntry
            // echo `egrep '^   ' res.txt | grep ',' | sed 's/ */"/' | sed 's/ .*/"/' ` | sed  's/ /, /g'
            new String [] {"dot3StatsIndex", "ifName", "dot3StatsAlignmentErrors", "dot3StatsFCSErrors",
            "dot3StatsSingleCollisionFrames", "dot3StatsMultipleCollisionFrames", "dot3StatsSQETestErrors",
            "dot3StatsDeferredTransmissions", "dot3StatsLateCollisions", "dot3StatsExcessiveCollisions",
            "dot3StatsInternalMacTransmitErrors", "dot3StatsCarrierSenseErrors", "dot3StatsFrameTooLongs",
            "dot3StatsInternalMacReceiveErrors", "dot3StatsSymbolErrors", "dot3StatsDuplexStatus",
            "dot3StatsRateControlAbility", "dot3StatsRateControlStatus"},
            new Object [][] {
              {1},
              {15, "gnetwatch error", "duplex mode unknown", "half-duplex", "full-duplex"},
              {16, "false", "true"},
              {17, "gnetwatch error", "control off", "control on", "unknown control mode"},
            });
      }
    });

    new MenuItem(menu_view, SWT.SEPARATOR);

    // Menu "View": MenuItem "Get VLAN Table"
    final MenuItem menu_item_get_vlan_table = new MenuItem(menu_view, SWT.PUSH);
    menu_item_get_vlan_table.setText(getConfig().getString("menu_get_vlan_table"));
    menu_item_get_vlan_table.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1)
          getGenericTable(tree.getSelection()[0],
            "VLANs",
            "1.3.6.1.4.1.9.9.46.1.3.1.1",
            new int [] {18, 4, 2},
            new String [] {"vlan ID", "vlan name", "vlan state"},
            new Object [][] {
            {0, "#idx"},
            {2, "gnetwatch error", "operational", "suspended", "mtuTooBigForDevice", "mtuTooBigForTrunk"}
          });
      }
    });

    // Menu "View": MenuItem "Mac2If"
    final MenuItem menu_item_get_mac2if_table = new MenuItem(menu_view, SWT.PUSH);
    menu_item_get_mac2if_table.setText(getConfig().getString("menu_mac2if_table"));
    menu_item_get_mac2if_table.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        widgetSelected(e);
      }

      public void widgetSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1)
          getMACTable(tree.getSelection()[0]);
      }
    });

    /*
    // Menu "View": MenuItem getConfig().getString("menu_open_graph")
    final MenuItem menu_item_open_graph = new MenuItem(menu_view, SWT.PUSH);
    menu_item_open_graph.setText(getConfig().getString("menu_open_graph"));
    menu_item_open_graph.setImage(new Image(display, "pictures/oscilloscope-af.png"));
    menu_item_open_graph.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        log.debug("open graph");
      }
    });

    // Menu "View": MenuItem getConfig().getString("menu_close_view")
    final MenuItem menu_item_close_view = new MenuItem(menu_view, SWT.PUSH);
    menu_item_close_view.setText(getConfig().getString("menu_close_view"));
    menu_item_close_view.setImage(new Image(display, "pictures/multirow-af-cross.png"));
    menu_item_close_view.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        log.debug("close view");
      }
    });
    */

    // Menu "Status"
    final Menu menu_status = new Menu(shell, SWT.DROP_DOWN);
    final MenuItem menu_item_status = new MenuItem(menu_bar, SWT.CASCADE);
    menu_item_status.setText(getConfig().getString("menu_status"));
    menu_item_status.setMenu(menu_status);

    // Menu "Status": MenuItem "Local interfaces"
    final MenuItem menu_item_local_interfaces = new MenuItem(menu_status, SWT.PUSH);
    menu_item_local_interfaces.setText(getConfig().getString("menu_local_interfaces"));
    menu_item_local_interfaces.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        appendNetworkInterfaces();
      }
    });

    // Menu "Status": MenuItem "Database statistics"
    final MenuItem menu_item_database_statistics = new MenuItem(menu_status, SWT.PUSH);
    menu_item_database_statistics.setText(getConfig().getString("menu_database_statistics"));
    menu_item_database_statistics.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        appendDatabaseStatistics();
      }
    });

    // Menu "Window"
    final Menu menu_window = new Menu(shell, SWT.DROP_DOWN);
    final MenuItem menu_item_window = new MenuItem(menu_bar, SWT.CASCADE);
    menu_item_window.setText(getConfig().getString("menu_window"));
    menu_item_window.setMenu(menu_window);

    // Menu "Window": MenuItem "Hide left panel"
    menu_item_hide = new MenuItem(menu_window, SWT.PUSH);
    menu_item_hide.setText(getConfig().getString("menu_hide"));
    menu_item_hide.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_hide.setEnabled(false);
        menu_item_show.setEnabled(true);
        groups_composite_grid_data.exclude = true;
        groups_composite.setVisible(false);
        horizontal_composite.layout();
      }
    });

    // Menu "Window": MenuItem "Show left panel"
    menu_item_show = new MenuItem(menu_window, SWT.PUSH);
    menu_item_show.setText(getConfig().getString("menu_show"));
    menu_item_show.setEnabled(false);
    menu_item_show.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_hide.setEnabled(true);
        menu_item_show.setEnabled(false);
        groups_composite_grid_data.exclude = false;
        groups_composite.setVisible(true);
        horizontal_composite.layout();
      }
    });

    new MenuItem(menu_window, SWT.SEPARATOR);

    // Menu "Window": MenuItem "Clear information panel"
    menu_item_clear = new MenuItem(menu_window, SWT.PUSH);
    menu_item_clear.setText(getConfig().getString("menu_clear"));
    menu_item_clear.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        clearConsole();
      }
    });

    // Menu "Help"
    final Menu menu_help = new Menu(shell, SWT.DROP_DOWN);
    final MenuItem menu_item_help = new MenuItem(menu_bar, SWT.CASCADE);
    menu_item_help.setText(getConfig().getString("menu_help"));
    menu_item_help.setMenu(menu_help);

    // Menu "Help": MenuItem "Welcome"
    final MenuItem menu_item_welcome = new MenuItem(menu_help, SWT.PUSH);
    menu_item_welcome.setText(getConfig().getString("menu_welcome"));
    menu_item_welcome.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        tab_folder.setSelection(tab_item1);
      }
    });

    // Menu "Help": MenuItem "Help Contents"
    final MenuItem menu_item_help_contents = new MenuItem(menu_help, SWT.PUSH);
    menu_item_help_contents.setText(getConfig().getString("menu_help_contents"));
    menu_item_help_contents.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        tab_folder.setSelection(tab_item2);
      }
    });

    new MenuItem(menu_help, SWT.SEPARATOR);

    // Menu "Help": MenuItem "About"
    final MenuItem menu_item_about = new MenuItem(menu_help, SWT.PUSH);
    menu_item_about.setText(getConfig().getString("menu_about"));
    menu_item_about.setImage(new Image(display, "pictures/info.png"));
    menu_item_about.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        final DialogAbout dialog = new DialogAbout(gui, shell);
        dialog.open();
      }
    });

    /*
    new MenuItem(menu_help, SWT.SEPARATOR);

    // Menu "Help": MenuItem "Software Update"
    final MenuItem menu_item_new_version = new MenuItem(menu_help, SWT.PUSH);
    menu_item_new_version.setText(getConfig().getString("menu_software_update"));
    menu_item_new_version.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        log.debug("new version");
      }
    });
    */

    /*
     * ToolBar
     */
    toolbar = new ToolBar(shell, SWT.FLAT);
    final ToolItem item_exit = new ToolItem(toolbar, SWT.PUSH);
    item_exit.setImage(new Image(display, "pictures/exit.png"));
    item_exit.setToolTipText(getConfig().getString("exit"));
    item_exit.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_exit.notifyListeners(SWT.Selection, e);
      }
    });

    new ToolItem(toolbar, SWT.SEPARATOR);

    item_discover_start = new ToolItem(toolbar, SWT.PUSH);
    item_discover_start.setImage(new Image(display, "pictures/exec.png"));
    item_discover_start.setToolTipText(getConfig().getString("start_sniffer"));
    item_discover_start.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_discover_start.notifyListeners(SWT.Selection, e);
      }
    });

    item_discover_stop = new ToolItem(toolbar, SWT.PUSH);
    item_discover_stop.setImage(new Image(display, "pictures/fileclose.png"));
    item_discover_stop.setToolTipText(getConfig().getString("stop_sniffer"));
    item_discover_stop.setEnabled(false);
    item_discover_stop.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_discover_stop.notifyListeners(SWT.Selection, e);
      }
    });

    new ToolItem(toolbar, SWT.SEPARATOR);

    final ToolItem item_expand_all = new ToolItem(toolbar, SWT.PUSH);
    item_expand_all.setImage(new Image(display, "pictures/show_table_column.png"));
    item_expand_all.setToolTipText(getConfig().getString("expand_all"));
    item_expand_all.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_expand_all.notifyListeners(SWT.Selection, e);
      }
    });

    final ToolItem item_merge_all = new ToolItem(toolbar, SWT.PUSH);
    item_merge_all.setImage(new Image(display, "pictures/hide_table_column.png"));
    item_merge_all.setToolTipText(getConfig().getString("collapse_all"));
    item_merge_all.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_merge_all.notifyListeners(SWT.Selection, e);
      }
    });

    new ToolItem(toolbar, SWT.SEPARATOR);

    item_add_host = new ToolItem(toolbar, SWT.PUSH);
    item_add_host.setImage(new Image(display, "pictures/network_local.png"));
    item_add_host.setToolTipText(getConfig().getString("add_ipv4_host"));
    item_add_host.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_add_host.notifyListeners(SWT.Selection, e);
      }
    });

    item_add_network = new ToolItem(toolbar, SWT.PUSH);
    item_add_network.setImage(new Image(display, "pictures/network.png"));
    item_add_network.setToolTipText(getConfig().getString("add_network"));
    item_add_network.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_add_network.notifyListeners(SWT.Selection, e);
      }
    });

    item_remove_target = new ToolItem(toolbar, SWT.PUSH);
    item_remove_target.setImage(new Image(display, "pictures/nomailappt.png"));
    item_remove_target.setToolTipText(getConfig().getString("remove_element"));
    item_remove_target.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_remove_target.notifyListeners(SWT.Selection, e);
      }
    });

    new ToolItem(toolbar, SWT.SEPARATOR);

    item_add_ping = new ToolItem(toolbar, SWT.PUSH);
    item_add_ping.setImage(new Image(display, "pictures/yahoo_idle-af.png"));
    item_add_ping.setToolTipText("ping");
    item_add_ping.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_add_ping.notifyListeners(SWT.Selection, e);
      }
    });

    item_remove_action = new ToolItem(toolbar, SWT.PUSH);
    item_remove_action.setImage(new Image(display, "pictures/button_cancel-af.png"));
    item_remove_action.setToolTipText(getConfig().getString("drop_action"));
    item_remove_action.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_remove_action.notifyListeners(SWT.Selection, e);
      }
    });

/*
    new ToolItem(toolbar, SWT.SEPARATOR);

    final ToolItem item_open_view = new ToolItem(toolbar, SWT.PUSH);
    item_open_view.setImage(new Image(display, "pictures/multirow.png"));
    item_open_view.setToolTipText("open view");
    item_open_view.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_open_view.notifyListeners(SWT.Selection, e);
      }
    });
*/

    /*
    final ToolItem item_open_graph = new ToolItem(toolbar, SWT.PUSH);
    item_open_graph.setImage(new Image(display, "pictures/oscilloscope-af.png"));
    item_open_graph.setToolTipText("open graph");
    item_open_graph.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_open_graph.notifyListeners(SWT.Selection, e);
      }
    });

    final ToolItem item_close_view = new ToolItem(toolbar, SWT.PUSH);
    item_close_view.setImage(new Image(display, "pictures/multirow-af-cross.png"));
    item_close_view.setToolTipText("close view");
    item_close_view.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_close_view.notifyListeners(SWT.Selection, e);
      }
    });
*/

    new ToolItem(toolbar, SWT.SEPARATOR);

    ToolItem item_about = new ToolItem(toolbar, SWT.PUSH);
    item_about.setImage(new Image(display, "pictures/info.png"));
    item_about.setToolTipText(getConfig().getString("help"));
    item_about.addListener(SWT.Selection, new Listener() {
      public void handleEvent(final Event e) {
        menu_item_about.notifyListeners(SWT.Selection, e);
      }
    });

    // GridData
    toolbar_grid_data = new GridData(GridData.FILL_HORIZONTAL);
    toolbar.setLayoutData(toolbar_grid_data);

    // vertical Sash for Composite and text console
    vertical_sash = new SashForm(shell, SWT.VERTICAL);
    vertical_sash_grid_data = new GridData(GridData.FILL_BOTH);
    vertical_sash.setLayoutData(vertical_sash_grid_data);
    // vertical_sash.setBackground(display.getSystemColor(SWT.COLOR_RED));

    // horizontal Composite
    horizontal_composite = new Composite(vertical_sash, SWT.FLAT);
    // composite.setBackground(display.getSystemColor(SWT.COLOR_RED));
    horizontal_composite_layout = new GridLayout();
    horizontal_composite_layout.numColumns = 2;
    horizontal_composite_layout.marginHeight = 0;
    horizontal_composite_layout.marginWidth = 0;
    horizontal_composite.setLayout(horizontal_composite_layout);

    // text console
    text_console = new Browser(vertical_sash, SWT.BORDER | SWT.FILL);
    appendConsole(htmlFace("GNetWatch - &copy; 2006, 2007, 2008<BR/>"));
    text_console.addProgressListener(new ProgressListener() {
      public void changed(ProgressEvent e) {}
      public void completed(ProgressEvent e) {
        // il faudrait mettre une valeur max plut�t que �a...
        if (text_console_do_not_go_on_top > 0) text_console_do_not_go_on_top--;
        else text_console.execute("window.scroll(0,1000000);");
      }
    });

    // set vertical_sash relative weights
    vertical_sash.setWeights(new int [] { 4, 1 });

    // Composite for groups at left
    groups_composite = new Composite(horizontal_composite, SWT.FLAT);
    groups_composite_layout = new RowLayout(SWT.VERTICAL);
    groups_composite_layout.fill = true;
    groups_composite_layout.marginTop = 0;
    groups_composite_layout.marginBottom = 0;
    groups_composite.setLayout(groups_composite_layout);
    groups_composite_grid_data = new GridData(GridData.FILL_VERTICAL);
    groups_composite.setLayoutData(groups_composite_grid_data);

    // Group for subnet targets

    group_target_subnet = new Group(groups_composite, SWT.SHADOW_ETCHED_IN);
    group_target_subnet_layout = new GridLayout();
    group_target_subnet_layout.numColumns = 2;
    group_target_subnet.setLayout(group_target_subnet_layout);
    group_target_subnet.setText(getConfig().getString("create_network_target"));

    label1 = new Label(group_target_subnet, SWT.SHADOW_IN);
    label1.setText(getConfig().getString("address"));
    label1.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    target_subnet_address = new Text(group_target_subnet, SWT.READ_ONLY | SWT.SINGLE);
    target_subnet_address.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END /*| GridData.GRAB_HORIZONTAL*/ | GridData.FILL_VERTICAL));
    target_subnet_address.setBackground(new Color(display, bglevel, bglevel, bglevel));
    target_subnet_address.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
    new IpAddressEditor(getConfig(), target_subnet_address);

    label2 = new Label(group_target_subnet, SWT.SHADOW_IN);
    label2.setText(getConfig().getString("netmask"));
    label2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    target_subnet_mask = new Text(group_target_subnet, SWT.READ_ONLY | SWT.SINGLE);
    target_subnet_mask.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END /*| GridData.GRAB_HORIZONTAL*/ | GridData.FILL_VERTICAL));
    target_subnet_mask.setBackground(new Color(display, bglevel, bglevel, bglevel));
    target_subnet_mask.setBackground(new Color(display, bglevel, bglevel, bglevel));
    target_subnet_mask.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
    new IpAddressEditor(getConfig(), target_subnet_mask);

    new Label(group_target_subnet, SWT.SHADOW_NONE);

    target_subnet_push = new Button(group_target_subnet, SWT.PUSH);
    target_subnet_push.setText(getConfig().getString("add_subnet"));
    target_subnet_push.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
    target_subnet_push.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        synchronized (synchro) {
          synchronized (sync_tree) {
            final Session session = synchro.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            try  {
              addTargetAtCurrentPosition(new TargetIPv4Subnet("added by GUI",
                  GenericTools.stringToInet4Address(target_subnet_address.getText()),
                  GenericTools.stringToInet4Address(target_subnet_mask.getText())));
              target_subnet_address.setText("000.000.000.000");
              target_subnet_mask.setText("000.000.000.000");
              session.getTransaction().commit();
            } catch (final UnknownHostException ex) {
              log.error("Exception", ex);
              session.getTransaction().rollback();
            } catch (final AlgorithmException ex) {
              log.error("Exception", ex);
              session.getTransaction().rollback();
              System.exit(1);
            }
          }
        }
      }
      public void widgetSelected(SelectionEvent e) {
        widgetDefaultSelected(e);
      }
    });

    // Group for range targets

    group_target_range = new Group(groups_composite, SWT.SHADOW_ETCHED_IN);
    group_target_range_layout = new GridLayout();
    group_target_range_layout.numColumns = 2;
    group_target_range.setLayout(group_target_range_layout);
    group_target_range.setText(getConfig().getString("create_range_target"));

    label3 = new Label(group_target_range, SWT.SHADOW_IN);
    label3.setText(getConfig().getString("first_address"));
    label3.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    target_range_begin = new Text(group_target_range, SWT.READ_ONLY | SWT.SINGLE);
    target_range_begin.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.FILL_VERTICAL));
    target_range_begin.setBackground(new Color(display, bglevel, bglevel, bglevel));
    target_range_begin.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
    new IpAddressEditor(getConfig(), target_range_begin);

    label4 = new Label(group_target_range, SWT.SHADOW_IN);
    label4.setText(getConfig().getString("last_address"));
    label4.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    target_range_end = new Text(group_target_range, SWT.READ_ONLY | SWT.SINGLE);
    target_range_end.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.FILL_VERTICAL));
    target_range_end.setBackground(new Color(display, bglevel, bglevel, bglevel));
    target_range_end.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
    new IpAddressEditor(getConfig(), target_range_end);

    new Label(group_target_range, SWT.SHADOW_NONE);

    target_range_push = new Button(group_target_range, SWT.PUSH);
    target_range_push.setText(getConfig().getString("add_range"));
    target_range_push.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
    target_range_push.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        synchronized (synchro) {
          synchronized (sync_tree) {
            final Session session = synchro.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            try  {
              addTargetAtCurrentPosition(new TargetIPv4Range("added by GUI",
                  GenericTools.stringToInet4Address(target_range_begin.getText()),
                  GenericTools.stringToInet4Address(target_range_end.getText())));
              target_range_begin.setText("000.000.000.000");
              target_range_end.setText("000.000.000.000");
              session.getTransaction().commit();
            } catch (final UnknownHostException ex) {
              log.error("Exception", ex);
              session.getTransaction().rollback();
            } catch (final AlgorithmException ex) {
              log.error("Exception", ex);
              session.getTransaction().rollback();
              System.exit(1);
            }
          }
        }
      }
      public void widgetSelected(SelectionEvent e) {
        widgetDefaultSelected(e);
      }
    });

    // Group for host targets

    group_target_host = new Group(groups_composite, SWT.SHADOW_ETCHED_IN);
    group_target_host_layout = new GridLayout();
    group_target_host_layout.numColumns = 2;
    group_target_host.setLayout(group_target_host_layout);
    group_target_host.setText(getConfig().getString("create_ipv4_target"));

    label5 = new Label(group_target_host, SWT.SHADOW_IN);
    label5.setText(getConfig().getString("host_address"));
    label5.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    target_host_value = new Text(group_target_host, SWT.READ_ONLY | SWT.SINGLE);
    target_host_value.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.FILL_VERTICAL));
    target_host_value.setBackground(new Color(display, bglevel, bglevel, bglevel));
    target_host_value.setForeground(display.getSystemColor(SWT.COLOR_WHITE));
    new IpAddressEditor(getConfig(), target_host_value);

    new Label(group_target_host, SWT.SHADOW_NONE);

    target_host_push = new Button(group_target_host, SWT.PUSH);
    target_host_push.setText(getConfig().getString("add_ipv4_host"));
    target_host_push.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
    target_host_push.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        synchronized (synchro) {
          synchronized (sync_tree) {
            final Session session = synchro.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            try  {
              final TargetIPv4 foo = new TargetIPv4("added by GUI",
                  GenericTools.stringToInet4Address(target_host_value.getText()), snmp_manager);
              if (addTargetAtCurrentPosition(foo) == true) foo.checkSNMPAwareness();
              target_host_value.setText("000.000.000.000");
              session.getTransaction().commit();
            } catch (final UnknownHostException ex) {
              log.error("Exception", ex);
              session.getTransaction().rollback();
            } catch (final AlgorithmException ex) {
              log.error("Exception", ex);
              session.getTransaction().rollback();
              System.exit(1);
            }
          }
        }
      }
      public void widgetSelected(SelectionEvent e) {
        widgetDefaultSelected(e);
      }
    });

    target_host_push.addControlListener(new ControlListener() {
      public void controlMoved(final ControlEvent e) {}

      public void controlResized(final ControlEvent e) {
        final GC gc = new GC(target_host_value);
        gc.setFont(target_host_value.getFont());
        ((GridData) (target_group_value.getLayoutData())).widthHint = gc.stringExtent(target_host_value.getText()).x;
        ((GridData) (target_host6_value.getLayoutData())).widthHint = gc.stringExtent(target_host_value.getText()).x;
        shell.changed(new Control [] { target_group_value, target_host6_value });
      }
    });

    // Group for IPv6 targets

    group_target_host6 = new Group(groups_composite, SWT.SHADOW_ETCHED_IN);
    group_target_host6_layout = new GridLayout();
    group_target_host6_layout.numColumns = 2;
    group_target_host6.setLayout(group_target_host6_layout);
    group_target_host6.setText(getConfig().getString("create_ipv6_target"));

    label7 = new Label(group_target_host6, SWT.SHADOW_IN);
    label7.setText(getConfig().getString("ipv6_address"));
    label7.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    target_host6_value = new Text(group_target_host6, SWT.SINGLE);
    target_host6_value.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.FILL_VERTICAL));
    target_host6_value.setBackground(new Color(display, bglevel, bglevel, bglevel));
    target_host6_value.setForeground(display.getSystemColor(SWT.COLOR_WHITE));

    new Label(group_target_host6, SWT.SHADOW_NONE);

    target_host6_push = new Button(group_target_host6, SWT.PUSH);
    target_host6_push.setText(getConfig().getString("add_ipv6_host"));
    target_host6_push.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
    target_host6_push.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        try {
          final Inet6Address address = GenericTools.stringToInet6Address(target_host6_value.getText());
          if (address == null) {
            final MessageBox dialog = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
            dialog.setText(getConfig().getString("gnetwatch_error"));
            dialog.setMessage(getConfig().getString("cannot_parse_ipv6"));
            dialog.open();
            return;
          }
          synchronized (synchro) {
            synchronized (sync_tree) {
              final Session session = synchro.getSessionFactory().getCurrentSession();
              session.beginTransaction();
              try  {
                final TargetIPv6 foo = new TargetIPv6("added by GUI", address, snmp_manager);
                if (addTargetAtCurrentPosition(foo) == true) foo.checkSNMPAwareness();
                target_host6_value.setText("");
                session.getTransaction().commit();
              } catch (Exception ex) {
                session.getTransaction().rollback();
                throw ex;
              }
            }
          }
        } catch (final UnknownHostException ex) {
          log.error("Exception", ex);
          final MessageBox dialog = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
          dialog.setText("GNetWatch - Error");
          dialog.setMessage(getConfig().getString("cannot_parse_ipv6"));
          dialog.open();
        } catch (final AlgorithmException ex) {
          log.error("Exception", ex);
          System.exit(1);
        } catch (final Exception ex) {
          log.error("Exception", ex);
        }
      }
      public void widgetSelected(final SelectionEvent e) {
        widgetDefaultSelected(e);
      }
    });

    // Group for group targets

    group_target_group = new Group(groups_composite, SWT.SHADOW_ETCHED_IN);
    group_target_group_layout = new GridLayout();
    group_target_group_layout.numColumns = 2;
    group_target_group.setLayout(group_target_group_layout);
    group_target_group.setText(getConfig().getString("create_group_target"));

    label6 = new Label(group_target_group, SWT.SHADOW_IN);
    label6.setText(getConfig().getString("group_name"));
    label6.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    target_group_value = new Text(group_target_group, SWT.SINGLE);
    target_group_value.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.FILL_VERTICAL));
    target_group_value.setBackground(new Color(display, bglevel, bglevel, bglevel));
    target_group_value.setForeground(display.getSystemColor(SWT.COLOR_WHITE));

    new Label(group_target_group, SWT.SHADOW_NONE);

    target_group_push = new Button(group_target_group, SWT.PUSH);
    target_group_push.setText(getConfig().getString("add_group"));
    target_group_push.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
    target_group_push.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        try {
          if (target_group_value.getText() != "")
            synchronized (synchro) {
              synchronized (sync_tree) {
                final Session session = synchro.getSessionFactory().getCurrentSession();
                session.beginTransaction();
                try {
                  addTargetAtCurrentPosition(new TargetGroup("added by GUI", target_group_value.getText()));
                  session.getTransaction().commit();
                } catch (Exception ex) {
                  session.getTransaction().rollback();
                  throw ex;
                }
              }
            } else {
              final MessageBox dialog = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
              dialog.setText(getConfig().getString("gnetwatch_error"));
              dialog.setMessage(getConfig().getString("cannot_add_group"));
              dialog.open();
            } target_group_value.setText("");
        } catch (final AlgorithmException ex) {
          log.error("Exception", ex);
          System.exit(1);
        } catch (final Exception ex) {
          log.error("Exception", ex);
        }
      }
      public void widgetSelected(final SelectionEvent e) {
        widgetDefaultSelected(e);
      }
    });

    // vertical space (hint to be sure left groups are visible at launch time)
    new Label(groups_composite, SWT.SHADOW_ETCHED_IN);

    // group container for data

    /*
    group_data = new Group(groups_composite, SWT.SHADOW_ETCHED_IN);
    group_data.setText("Data");
    group_data_layout = new GridLayout();
    group_data_layout.numColumns = 2;
    group_data.setLayout(group_target_subnet_layout);
    */

    // Sash for Tree and Label
    horizontal_sash = new SashForm(horizontal_composite, SWT.HORIZONTAL);
    horizontal_sash_grid_data = new GridData(GridData.FILL_BOTH);
    horizontal_sash.setLayoutData(horizontal_sash_grid_data);

    // Tree
    tree = new Tree(horizontal_sash, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
    tree.addSelectionListener(new SelectionListener() {
      public void widgetDefaultSelected(SelectionEvent e) {
        if (tree.getSelectionCount() == 1) {
          TreeItem current_item = tree.getSelection()[0];
          if (current_item != null) {
            synchronized (synchro) {
            synchronized (sync_tree) {
              final VisualElement visual_element = (VisualElement) current_item.getData(VisualElement.class.toString());
              if (visual_element != null) visual_element.informSelected();
            }
            }
            widgetSelected(e);
          }
        }
      }

      public void widgetSelected(SelectionEvent e) {
        gui.updateEnableState();
        if (tree.getSelectionCount() == 1) {
          TreeItem current_item = tree.getSelection()[0];
          if (current_item != null) {
            synchronized (sync_tree) {
              final VisualElement visual_element = (VisualElement) current_item.getData(VisualElement.class.toString());

              if (visual_element.getProgress() != -1) setProgress(visual_element.getProgress());

              if (previous_selection != null) previous_selection.unselected();
              visual_element.selected();
              previous_selection = visual_element;

              setEnableMenuItemOptions(TargetIPv4.class.isInstance(visual_element) || TargetIPv6.class.isInstance(visual_element));

              if (ActionFlood.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_action.setEnabled(true);
                item_remove_action.setEnabled(true);
                menu_item_remove_action_flood.setEnabled(true);
              } else if (ActionPing.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_action.setEnabled(true);
                item_remove_action.setEnabled(true);
                menu_item_remove_action_ping.setEnabled(true);
              } else if (ActionSNMP.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_action.setEnabled(true);
                item_remove_action.setEnabled(true);
                menu_item_remove_action_explore.setEnabled(true);
              } else if (ActionHTTP.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_action.setEnabled(true);
                item_remove_action.setEnabled(true);
              } else if (ActionNmap.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_action.setEnabled(true);
                item_remove_action.setEnabled(true);
              } else if (ReachableView.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_target.setEnabled(true);
                item_remove_target.setEnabled(true);
                menu_item_remove_view.setEnabled(true);
                menu_item_remove_view_ping.setEnabled(true);
              } else if (FloodView.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_target.setEnabled(true);
                item_remove_target.setEnabled(true);
                menu_item_remove_view.setEnabled(true);
                menu_item_remove_view_flood.setEnabled(true);
              } else if (HTTPView.class.isInstance(visual_element) || HTTPPagesView.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_target.setEnabled(true);
                item_remove_target.setEnabled(true);
                menu_item_remove_view.setEnabled(true);
              } else if (BytesReceivedView.class.isInstance(visual_element) || BytesSentView.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_target.setEnabled(true);
                item_remove_target.setEnabled(true);
                menu_item_remove_view.setEnabled(true);
                menu_item_remove_view_explore.setEnabled(true);
              } else {
                // visual_element is neither a view nor an action
                setEnableMenuAndTool(true);

                if (visual_element.getChildren().size() == 0) {
                  // no children
                  menu_item_remove_action.setEnabled(false);
                  item_remove_action.setEnabled(false);
                  menu_item_remove_action_ping.setEnabled(false);
                  menu_item_remove_action_flood.setEnabled(false);
                  menu_item_remove_action_explore.setEnabled(false);
                  menu_item_remove_view.setEnabled(false);
                  menu_item_remove_view_ping.setEnabled(false);
                  menu_item_remove_view_flood.setEnabled(false);
                  menu_item_remove_view_explore.setEnabled(false);
                }
              }

              if (net.fenyo.gnetwatch.actions.Action.class.isInstance(visual_element)) {
                setEnableGroupTargetSubnet(false);
                setEnableGroupTargetRange(false);
                setEnableGroupTargetHost(false);
                setEnableGroupTargetGroup(false);
              } else if (Target.class.isInstance(visual_element)) {
                try {
                  boolean foo;

                  final TargetGroup target_group = new TargetGroup("", "");
                  target_group.initialize(gui);
                  foo = target_group.canAddTarget(visual_element) && visual_element.canManageThisChild(target_group);
                  setEnableGroupTargetGroup(foo);

                  // No name service is checked for the validity of the address.
                  final Inet4Address bar = (Inet4Address) Inet4Address.getByAddress("bar", new byte [] { 0, 0, 0, 0 });

                  final TargetIPv4 target_ipv4 = new TargetIPv4("", bar, null);
                  target_ipv4.initialize(gui);
                  foo = target_ipv4.canAddTarget(visual_element) && visual_element.canManageThisChild(target_ipv4);
                  setEnableGroupTargetHost(foo);

                  final TargetIPv4Range target_ipv4_range = new TargetIPv4Range("", bar, bar);
                  target_ipv4_range.initialize(gui);
                  foo = target_ipv4_range.canAddTarget(visual_element) && visual_element.canManageThisChild(target_ipv4_range);
                  setEnableGroupTargetRange(foo);

                  final TargetIPv4Subnet target_ipv4_subnet = new TargetIPv4Subnet("", bar, bar);
                  target_ipv4_subnet.initialize(gui);
                  foo = target_ipv4_subnet.canAddTarget(visual_element) && visual_element.canManageThisChild(target_ipv4_subnet);
                  setEnableGroupTargetSubnet(foo);
                } catch (final AlgorithmException ex) {
                  log.error("Exception", ex);
                } catch (final UnknownHostException ex) {
                log.error("Exception", ex);
                }
              } else if (net.fenyo.gnetwatch.activities.Queue.class.isInstance(visual_element)) {
                setEnableGroupTargetSubnet(false);
                setEnableGroupTargetRange(false);
                setEnableGroupTargetHost(false);
                setEnableGroupTargetGroup(false);
              } else if (DataView.class.isInstance(visual_element)) {
                setEnableGroupTargetSubnet(false);
                setEnableGroupTargetRange(false);
                setEnableGroupTargetHost(false);
                setEnableGroupTargetGroup(false);
              } else if (visual_element.equals(visual_transient)) {
                setEnableGroupTargetSubnet(false);
                setEnableGroupTargetRange(false);
                setEnableGroupTargetHost(false);
                setEnableGroupTargetGroup(false);
              } else {
                setEnableGroupTargetSubnet(false);
                setEnableGroupTargetRange(false);
                setEnableGroupTargetHost(false);
                setEnableGroupTargetGroup(false);
              }
            }
          }
        }

      }
    });
    tree.setHeaderVisible(true);
    tree_column1 = new TreeColumn(tree, SWT.LEFT);
    tree_column1.setText(getConfig().getString("items"));
    tree_column1.setWidth(150);
    tree_column2 = new TreeColumn(tree, SWT.LEFT);
    tree_column2.setText("Type");
    tree_column2.setWidth(80);
    tree_column3 = new TreeColumn(tree, SWT.RIGHT);
    tree_column3.setText("Description");
    tree_column3.setWidth(100);

    // Tree images
    image_folder = new Image(display, "pictures/folder_violet.png");
    image_oscillo = new Image(display, "pictures/oscilloscope-af.png");
    image_multirow = new Image(display, "pictures/multirow.png");
    image_exec = new Image(display, "pictures/exec.png");
    image_watch = new Image(display, "pictures/yahoo_idle-af.png");
    image_host = new Image(display, "pictures/network_local.png");
    image_host6 = new Image(display, "pictures/network_local-6-af.png");
    image_interface = new Image(display, "pictures/memory.png");
    image_queue = new Image(display, "pictures/jabber_group.png");
    image_network = new Image(display, "pictures/network.png");
    image_host_snmp = new Image(display, "pictures/network_local_snmp.png");
    image_host6_snmp = new Image(display, "pictures/network_local-6-af-snmp.png");

    visual_root = new VisualElement();
    visual_root.setParent(this, tree);
    visual_root.setItem(config.getString("collected_data"));

    visual_queues = new VisualElement();
    visual_queues.setParent(this, tree);
    visual_queues.setItem(config.getString("queues"));

    } // release sync_tree

    // create initial objects only if they do not exist in the database
    synchronized (synchro) {
      synchronized (sync_tree) {
          final Session session = synchro.getSessionFactory().getCurrentSession();
          try {
            session.beginTransaction();
          } catch (final org.hibernate.exception.JDBCConnectionException ex) {
            // c'est ici que �a se termine quand on ouvre deux fois sur la m�me database maintenue par un fichier par HSQLDB
            final MessageBox dialog = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
            // � traduire
            dialog.setText("GNetWatch Fatal Error");
            dialog.setMessage(ex.toString() + " - caused by: " + ex.getCause().toString());
            dialog.open();
            session.getTransaction().rollback();
            System.exit(0);
          }

          try {

          final java.util.List results =
              session.createQuery("from VisualElement as el where el.item = ?")
              .setString(0, config.getString("targets")).list();
          if (results.size() > 1) log.error("database contains multiple root targets");
         
          if (results.size() > 0) {
            visual_transient = (VisualElement) results.get(0);
            visual_transient.initialize(this);
            visual_transient.duplicateTreeItemOnce(visual_root.getTreeItems());
            visual_transient.addParent(visual_root);

            // recursive initialization of every visual element stored in the database
            initFromSynchro(visual_transient);

          } else {

            visual_transient = new VisualElement();
            visual_transient.setParent(this, visual_root);
            visual_transient.setItem(config.getString("targets"));
            session.save(visual_transient);
          }

          for (final VisualElement foo : visual_transient.getChildren()) {
            if (foo.getItem().equals(config.getString("local_host")))
              visual_thishost = (TargetGroup) foo;
            if (foo.getItem().equals(config.getString("every_host")))
              visual_transient_all = (TargetGroup) foo;
            if (foo.getItem().equals(config.getString("every_network")))
              visual_transient_networks = (TargetGroup) foo;
            if (foo.getItem().equals(config.getString("user_defined")))
              user_defined = (TargetGroup) foo;
          }

          if (visual_thishost == null) {
            visual_thishost = new TargetGroup("added by GUI", config.getString("local_host"));
            visual_thishost.setParent(this, visual_transient);
            session.save(visual_thishost);
          }

          if (visual_transient_all == null) {
            visual_transient_all = new TargetGroup("added by GUI", config.getString("every_host"));
            visual_transient_all.setParent(this, visual_transient);
            session.save(visual_transient_all);
          }

          if (getConfig().getProperty("enableeverynetworks") != null &&
              getConfig().getProperty("enableeverynetworks").equals("true")) {

            if (visual_transient_networks == null) {
              visual_transient_networks = new TargetGroup("added by GUI", config.getString("every_network"));
              visual_transient_networks.setParent(this, visual_transient);
              session.save(visual_transient_networks);
            }

          }

          if (user_defined == null) {
            user_defined = new TargetGroup("added by GUI", config.getString("user_defined"));
            user_defined.setParent(this, visual_transient);
            session.save(user_defined);
          }

          // create localhost
          for (final Enumeration nifs = NetworkInterface.getNetworkInterfaces(); nifs.hasMoreElements(); ) {
            final NetworkInterface nif = (NetworkInterface) nifs.nextElement();
            for (final Enumeration addrs = nif.getInetAddresses(); addrs.hasMoreElements(); ) {
              final InetAddress addr = (InetAddress) addrs.nextElement();

              // localhost has IPv4 addresses
              if (Inet4Address.class.isInstance(addr)) {
                final TargetIPv4 foo = new TargetIPv4("transient localhost", (Inet4Address) addr, snmp_manager);
                if (foo == getCanonicalInstance(foo)) {
                  session.save(foo);
                  if (foo.addTarget(this, visual_thishost) == true) foo.checkSNMPAwareness();
                }
              }
    
              // localhost has IPv6 addresses
              if (Inet6Address.class.isInstance(addr)) {
                final TargetIPv6 foo = new TargetIPv6("transient localhost", (Inet6Address) addr, snmp_manager);
                if (foo == getCanonicalInstance(foo)) {
                  session.save(foo);
                  if (foo.addTarget(this, visual_thishost) == true) foo.checkSNMPAwareness();
                }
              }
            }

            // recursively initialize SNMPQuerier instances
            initSNMPQueriers(visual_transient);

            // recursively wakeup actions
            wakeupActions(visual_transient);
          }

          session.getTransaction().commit();
        } catch (final Exception ex) {
          log.error("Exception", ex);
        }
      }
    }

    synchronized (sync_tree) {

      // CTabFolder
      tab_folder = new CTabFolder(horizontal_sash, SWT.BORDER);
      tab_folder.setSimple(false);

      tab_item1 = new CTabItem(tab_folder, SWT.None);
      tab_item1.setText(getConfig().getString("about_the_author"));
      final Browser browser = new Browser(tab_folder, SWT.BORDER | SWT.MULTI);
      browser.setUrl("http://www.fenyo.net");
//   browser.setText("<HTML><BODY BGCOLOR='red'><H1>Data</H1>target: <B>127.0.0.1</B></BODY></HTML>");
      tab_item1.setControl(browser);

      tab_item2 = new CTabItem(tab_folder, SWT.None);
      tab_item2.setText("Documentation");
      final Browser browser2 = new Browser(tab_folder, SWT.BORDER | SWT.MULTI);
      browser2.setUrl("http://gnetwatch.sourceforge.net/docs");
      tab_item2.setControl(browser2);

      // StyledText
      status = new StyledText(shell, SWT.BORDER);
      status_grid_data = new GridData(GridData.FILL_HORIZONTAL);
      status.setLayoutData(status_grid_data);
      status.setEditable(false);
      status.setEnabled(false);
      status.setText("Loading...");
      status.setBackground(shell.getBackground());

      // ProgressBar
      progress_bar = new ProgressBar(shell, SWT.SMOOTH);
      progress_bar.setBounds(10, 10, 200, 32);
      progress_bar.setSelection(0);
      progress_bar_grid_data = new GridData(GridData.FILL_HORIZONTAL);
      progress_bar.setLayoutData(progress_bar_grid_data);

      // instanciate queues
     
      final String [] queue_names = background.getQueues().keySet().toArray(new String [] {});
      Arrays.sort(queue_names);
      for (final String queue_name : queue_names)
        background.getQueues().get(queue_name).setParent(this, visual_queues);

      // set initial selections
      menu_item_credentials.setEnabled(false);
      menu_item_ip_options.setEnabled(false);
      menu_item_http_options.setEnabled(false);
      setEnableGroupTargetSubnet(false);
      setEnableGroupTargetRange(false);
      setEnableGroupTargetHost(false);
      setEnableGroupTargetGroup(false);

    } // release sync_tree

    tree.setBackground(getBackgroundColor());

    // display documentation at startup
    tab_folder.setSelection(tab_item2);

    // final operations
    shell.pack();
    shell.open();

    visual_root.expandTreeItems(true);
    visual_queues.expandTreeItems(true);
    visual_transient.expandTreeItems(true);
    tree.setSelection(visual_root.getTreeItems().get(0));
    tree.setFocus();

    synchronized (GUI_created) {
      GUI_created[0] = true;
      GUI_created.notifyAll();
    }

    // list network interfaces at startup
    text_console_do_not_go_on_top = 1;
    appendNetworkInterfaces();

    awtGUI = new AwtGUI(config);
    awtGUI.createAwtGUI();
}

  // Queue thread
  public void informTargetHasNewEventClass(final Target target, final Class clazz) {
    asyncExec(new Runnable() {
      public void run() {
        try {
          views.refreshDataViews(target, clazz);
        } catch (final Exception ex) {
          log.error("Exception", ex);
        }
      }
    });
  }

  /**
   * Wait for the creation of the GUI objects.
   * Can be called from any thread.
   * main thread.
   * @param none.
   * @return void.
   */
  public void waitForCreation() {
    synchronized (GUI_created) {
      while (GUI_created[0] == false) {
        try {
          GUI_created.wait();
        }
        catch (final InterruptedException e) {
          log.debug("waitForCreation(): " + e);
        }
      }
    }
  }

  /**
   * GUI thread.
   * @param none.
   * @return void.
   */
  public void run() {
    try {
      createGUI();
    } catch (final Exception ex) {
      log.error("Exception", ex);
    }

    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }

    try {
      display.dispose();
    } catch (final SWTException ex) {
      log.warn("Exception", ex);
    }
  }

  /**
   * Constructor.
   * main thread.
   * Builds a user interface.
   * main thread.
   * @param none.
   */
  public GUI(final Config config, final Background background, final Main main, final SNMPManager snmp_manager, final Synchro synchro) {
    this.config = config;
    this.synchro = synchro;
    this.background = background;
    this.main = main;
    this.snmp_manager = snmp_manager;
    this.views = new Views(this);
    thread = new Thread(this, "GUI");

    // ((DebugQueue) background.getQueues().get("debug")).setGUI(this);

    thread.start();
  }

  // main thread
  public void end() throws InterruptedException {
    awtGUI.end();
  }

  /**
   * Waits for the main thread to terminate.
   * main thread.
   * @param none.
   * @return void.
   */
  public void join() {
    try {
      thread.join();
    }
    catch (final InterruptedException e) {
      log.debug("GUI thread already terminated.");
    }
  }

  // lock survey : sync_tree << synchro << HERE
  public void updateEnableState() {
    final GUI gui = this;
    asyncExec(new Runnable() {
      public void run() {
        if (tree.getSelectionCount() == 1) {
          TreeItem current_item = tree.getSelection()[0];
          if (current_item != null) {
            synchronized (sync_tree) {
              final VisualElement visual_element = (VisualElement) current_item.getData(VisualElement.class.toString());

              if (visual_element.getProgress() != -1) setProgress(visual_element.getProgress());

              if (previous_selection != null) previous_selection.unselected();
              visual_element.selected();
              previous_selection = visual_element;

              setEnableMenuItemOptions(TargetIPv4.class.isInstance(visual_element) || TargetIPv6.class.isInstance(visual_element));

              menu_item_add_process.setEnabled(visual_element.equals(visual_root) || visual_element.equals(visual_transient));
              menu_item_add_source.setEnabled(visual_element.equals(visual_root) || visual_element.equals(visual_transient));

              if (ActionFlood.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_action.setEnabled(true);
                item_remove_action.setEnabled(true);
                menu_item_remove_action_flood.setEnabled(true);
              } else if (ActionPing.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_action.setEnabled(true);
                item_remove_action.setEnabled(true);
                menu_item_remove_action_ping.setEnabled(true);
              } else if (ActionGenericProcess.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_action.setEnabled(true);
                item_remove_action.setEnabled(true);
              } else if (ActionGenericSrc.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_action.setEnabled(true);
                item_remove_action.setEnabled(true);
              } else if (ActionSNMP.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_action.setEnabled(true);
                item_remove_action.setEnabled(true);
                menu_item_remove_action_explore.setEnabled(true);
              } else if (ActionHTTP.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_action.setEnabled(true);
                item_remove_action.setEnabled(true);
              } else if (ActionNmap.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_action.setEnabled(true);
                item_remove_action.setEnabled(true);
              } else if (ReachableView.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_target.setEnabled(true);
                item_remove_target.setEnabled(true);
                menu_item_remove_view.setEnabled(true);
                menu_item_remove_view_ping.setEnabled(true);
              } else if (GenericProcessView.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_target.setEnabled(true);
                item_remove_target.setEnabled(true);
                menu_item_remove_view.setEnabled(true);
              } else if (GenericSrcView.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_target.setEnabled(true);
                item_remove_target.setEnabled(true);
                menu_item_remove_view.setEnabled(true);
              } else if (FloodView.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_target.setEnabled(true);
                item_remove_target.setEnabled(true);
                menu_item_remove_view.setEnabled(true);
                menu_item_remove_view_flood.setEnabled(true);
              } else if (HTTPView.class.isInstance(visual_element) || HTTPPagesView.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_target.setEnabled(true);
                item_remove_target.setEnabled(true);
                menu_item_remove_view.setEnabled(true);
              } else if (BytesReceivedView.class.isInstance(visual_element) || BytesSentView.class.isInstance(visual_element)) {
                setEnableMenuAndTool(false);
                menu_item_remove_target.setEnabled(true);
                item_remove_target.setEnabled(true);
                menu_item_remove_view.setEnabled(true);
                menu_item_remove_view_explore.setEnabled(true);
              } else {
                // visual_element is neither a view nor an action
                setEnableMenuAndTool(true);

                menu_item_generic_options.setEnabled(!(visual_element.equals(visual_root) || visual_element.equals(visual_transient)));
                if (visual_element.getParents().contains(visual_transient))
                  menu_item_generic_options.setEnabled(false);

                if (!visual_element.equals(visual_root) && !visual_element.equals(visual_transient)) {
                  menu_item_add_process.setEnabled(TargetGroup.class.isInstance(visual_element));
                  menu_item_add_source.setEnabled(TargetGroup.class.isInstance(visual_element));
                }

                if (visual_element.getChildren().size() == 0) {
                  // no children
                  menu_item_remove_action.setEnabled(false);
                  item_remove_action.setEnabled(false);
                  menu_item_remove_action_ping.setEnabled(false);
                  menu_item_remove_action_flood.setEnabled(false);
                  menu_item_remove_action_explore.setEnabled(false);
                  menu_item_remove_view.setEnabled(false);
                  menu_item_remove_view_ping.setEnabled(false);
                  menu_item_remove_view_flood.setEnabled(false);
                  menu_item_remove_view_explore.setEnabled(false);
                }
              }

              if (net.fenyo.gnetwatch.actions.Action.class.isInstance(visual_element)) {
                setEnableGroupTargetSubnet(false);
                setEnableGroupTargetRange(false);
                setEnableGroupTargetHost(false);
                setEnableGroupTargetGroup(false);
              } else if (Target.class.isInstance(visual_element)) {
                try {
                  boolean foo;

                  final TargetGroup target_group = new TargetGroup("", "");
                  target_group.initialize(gui);
                  foo = target_group.canAddTarget(visual_element) && visual_element.canManageThisChild(target_group);
                  setEnableGroupTargetGroup(foo);

                  // No name service is checked for the validity of the address.
                  final Inet4Address bar = (Inet4Address) Inet4Address.getByAddress("bar", new byte [] { 0, 0, 0, 0 });

                  final TargetIPv4 target_ipv4 = new TargetIPv4("", bar, null);
                  target_ipv4.initialize(gui);
                  foo = target_ipv4.canAddTarget(visual_element) && visual_element.canManageThisChild(target_ipv4);
                  setEnableGroupTargetHost(foo);

                  final TargetIPv4Range target_ipv4_range = new TargetIPv4Range("", bar, bar);
                  target_ipv4_range.initialize(gui);
                  foo = target_ipv4_range.canAddTarget(visual_element) && visual_element.canManageThisChild(target_ipv4_range);
                  setEnableGroupTargetRange(foo);

                  final TargetIPv4Subnet target_ipv4_subnet = new TargetIPv4Subnet("", bar, bar);
                  target_ipv4_subnet.initialize(gui);
                  foo = target_ipv4_subnet.canAddTarget(visual_element) && visual_element.canManageThisChild(target_ipv4_subnet);
                  setEnableGroupTargetSubnet(foo);
                } catch (final AlgorithmException ex) {
                  log.error("Exception", ex);
                } catch (final UnknownHostException ex) {
                log.error("Exception", ex);
                }
              } else if (net.fenyo.gnetwatch.activities.Queue.class.isInstance(visual_element)) {
                setEnableGroupTargetSubnet(false);
                setEnableGroupTargetRange(false);
                setEnableGroupTargetHost(false);
                setEnableGroupTargetGroup(false);
              } else if (DataView.class.isInstance(visual_element)) {
                setEnableGroupTargetSubnet(false);
                setEnableGroupTargetRange(false);
                setEnableGroupTargetHost(false);
                setEnableGroupTargetGroup(false);
              } else if (visual_element.equals(visual_transient)) {
                setEnableGroupTargetSubnet(false);
                setEnableGroupTargetRange(false);
                setEnableGroupTargetHost(false);
                setEnableGroupTargetGroup(false);
              } else {
                setEnableGroupTargetSubnet(false);
                setEnableGroupTargetRange(false);
                setEnableGroupTargetHost(false);
                setEnableGroupTargetGroup(false);
              }
            }
          }
        }
      }
    }
    );
  }


  /**
   * Enable/disable "add subnet" in the GUI.
   * @param enable enable/disable switch.
   * @return void.
   */
  private void setEnableGroupTargetSubnet(final boolean enable) {
    label1.setEnabled(enable);
    label2.setEnabled(enable);
    group_target_subnet.setEnabled(enable);
    target_subnet_address.setEnabled(enable);
    target_subnet_mask.setEnabled(enable);
    target_subnet_push.setEnabled(enable);
    menu_item_add_network.setEnabled(enable);
    item_add_network.setEnabled(enable);
  }

  /**
   * Enable/disable "add range" in the GUI.
   * @param enable enable/disable switch.
   * @return void.
   */
  private void setEnableGroupTargetRange(final boolean enable) {
    label3.setEnabled(enable);
    label4.setEnabled(enable);
    group_target_range.setEnabled(enable);
    target_range_begin.setEnabled(enable);
    target_range_end.setEnabled(enable);
    target_range_push.setEnabled(enable);
    menu_item_add_range.setEnabled(enable);
  }

  /**
   * Enable/disable "add host" in the GUI.
   * @param enable enable/disable switch.
   * @return void.
   */
  private void setEnableGroupTargetHost(final boolean enable) {
    label5.setEnabled(enable);
    label7.setEnabled(enable);
    group_target_host.setEnabled(enable);
    group_target_host6.setEnabled(enable);
    target_host_value.setEnabled(enable);
    target_host6_value.setEnabled(enable);
    target_host_push.setEnabled(enable);
    target_host6_push.setEnabled(enable);
    menu_item_add_host.setEnabled(enable);
    menu_item_add_host6.setEnabled(enable);
    item_add_host.setEnabled(enable);
  }

  private void setEnableMenuItemOptions(final boolean enable) {
    menu_item_credentials.setEnabled(enable);
    menu_item_ip_options.setEnabled(enable);
    menu_item_http_options.setEnabled(enable);
  }

  private void setEnableMenuAndTool(final boolean enable) {
    menu_item_generic_options.setEnabled(enable);
    menu_item_remove_target.setEnabled(enable);
    item_remove_target.setEnabled(enable);
    menu_item_add_ping.setEnabled(enable);
    menu_item_add_process.setEnabled(enable);
    menu_item_add_source.setEnabled(enable);
    item_add_ping.setEnabled(enable);
    menu_item_add_flood.setEnabled(enable);
    menu_item_explore_snmp.setEnabled(enable);
    menu_item_add_http.setEnabled(enable);
    menu_item_explore_nmap.setEnabled(enable);
    menu_item_remove_action.setEnabled(enable);
    item_remove_action.setEnabled(enable);
    menu_item_remove_action_ping.setEnabled(enable);
    menu_item_remove_action_flood.setEnabled(enable);
    menu_item_remove_action_explore.setEnabled(enable);
    menu_item_remove_view.setEnabled(enable);
    menu_item_remove_view_ping.setEnabled(enable);
    menu_item_remove_view_flood.setEnabled(enable);
    menu_item_remove_view_explore.setEnabled(enable);
  }

  /**
   * Enable/disable "add group" in the GUI.
   * @param enable enable/disable switch.
   * @return void.
   */
  private void setEnableGroupTargetGroup(final boolean enable) {
    label6.setEnabled(enable);
    group_target_group.setEnabled(enable);
    target_group_value.setEnabled(enable);
    target_group_push.setEnabled(enable);
    menu_item_add_group.setEnabled(enable);
  }

  private void initFromSynchro(final VisualElement elt) {
    for (final VisualElement child : elt.getChildren()) {
      child.initialize(this);
      child.duplicateTreeItemOnce(elt.getTreeItems());
      child.addParent(elt);

      if (Target.class.isInstance(child)) {
        // register child as a new canonical instance
        if (child != getCanonicalInstance((Target) child))
          log.error("target already registered, database will not match in-memory objects");
      }
    }

    for (final VisualElement child : elt.getChildren())
      initFromSynchro(child);
  }

  private void wakeupActions(final VisualElement elt) {
    for (final VisualElement child : elt.getChildren()) wakeupActions(child);
    if (net.fenyo.gnetwatch.actions.Action.class.isInstance(elt)) {
      final net.fenyo.gnetwatch.actions.Action action = (net.fenyo.gnetwatch.actions.Action) elt;
      if (action.getBackground() == null) {
        action.setBackground(background);
        try {
          background.addActionQueue(action);
        } catch (GeneralException ex) {
          log.warn("can not restart action:" + action + " - target: " + action.getTarget());
        }
      }
    }
  }

  private void initSNMPQueriers(final VisualElement elt) {
    for (final VisualElement child : elt.getChildren()) initSNMPQueriers(child);
    if (TargetIPv4.class.isInstance(elt)) {
      final TargetIPv4 target = (TargetIPv4) elt;
      target.getSNMPQuerier().setSNMPManager(snmp_manager);
      target.getSNMPQuerier().parametersHaveChanged();
    }

    if (TargetIPv6.class.isInstance(elt)) {
      final TargetIPv6 target = (TargetIPv6) elt;
      target.getSNMPQuerier().setSNMPManager(snmp_manager);
      target.getSNMPQuerier().parametersHaveChanged();
    }
  }
        
/**
   * Parses a configuration file to create initial targets.
   * @param filename configuration file.
   * @return void.
   */
  public void createFromXML(final String filename) {
    final GUI gui = this;

    asyncExec(new Runnable() {
      public void run() {
        synchronized (synchro) {
          final Session session = synchro.getSessionFactory().getCurrentSession();
          session.beginTransaction();

          try {
            final XMLConfiguration initial = new XMLConfiguration(filename);
            initial.setExpressionEngine(new XPathExpressionEngine());

            // limitation de l'impl�mentation : on n'autorise que les parents de type groupe

            for (final HierarchicalConfiguration subconf : (java.util.List<HierarchicalConfiguration>)
                initial.configurationsAt("/objects/target")) {
              if (subconf.getProperty("@targetType").equals("group")) {
                final String name = subconf.getString("name");

                final java.util.List<String> parents = (java.util.List<String>) subconf.getList("parent[@parentType='group']");
                if (parents.size() == 0) {
                  final TargetGroup target_group = new TargetGroup("added by initial configuration", name);
                  target_group.addTarget(gui, user_defined);
                } else for (final String parent : parents) {
                    final TargetGroup foo = new TargetGroup("temporary", parent);
                    final TargetGroup target_parent = (TargetGroup) getCanonicalInstance(foo);
                    if (target_parent == foo) log.error("Initial configuration: parent does not exist");
                    else {
                      final TargetGroup target_group = new TargetGroup("added by initial configuration", name);
                      target_group.addTarget(gui, target_parent);
                    }
                  }
              }

              if (subconf.getProperty("@targetType").equals("ipv4")) {
                final String address = subconf.getString("address");

                java.util.List<String> parents = (java.util.List<String>) subconf.getList("parent[@parentType='group']");
                if (parents.size() != 0) for (final String parent : parents) {
                  final TargetGroup foo = new TargetGroup("temporary", parent);
                  final TargetGroup target_parent = (TargetGroup) getCanonicalInstance(foo);
                  if (target_parent == foo) log.error("Initial configuration: parent does not exist");
                  else {
                    final TargetIPv4 target = new TargetIPv4("added by initial configuration", GenericTools.stringToInet4Address(address), snmp_manager);
                    target.addTarget(gui, target_parent);
                    if (subconf.getString("snmp/version") != null) {
                      if (subconf.getString("snmp/version").equals("v1")) target.getSNMPQuerier().setVersion(0);
                      if (subconf.getString("snmp/version").equals("v2c")) target.getSNMPQuerier().setVersion(1);
                      if (subconf.getString("snmp/version").equals("v3")) target.getSNMPQuerier().setVersion(2);
                    }
                    if (subconf.getString("snmp/community") != null)
                      target.getSNMPQuerier().setCommunity(subconf.getString("snmp/community"));

                    // Setting the agent is not possible when creating a target through the GUI
                    if (subconf.getString("snmp/agent") != null)
                      target.getSNMPQuerier().setAddress(GenericTools.stringToInet4Address(subconf.getString("snmp/agent")));

                    if (subconf.getString("snmp/password-auth") != null)
                      target.getSNMPQuerier().setPasswordAuth(subconf.getString("snmp/password-auth"));
                    if (subconf.getString("snmp/password-priv") != null)
                      target.getSNMPQuerier().setPasswordPriv(subconf.getString("snmp/password-priv"));
                    if (subconf.getString("snmp/pdu-max-size") != null)
                      target.getSNMPQuerier().setPDUMaxSize(subconf.getInt("snmp/pdu-max-size"));
                    if (subconf.getString("snmp/port") != null)
                      target.getSNMPQuerier().setPort(subconf.getInt("snmp/port"));
                    if (subconf.getString("snmp/retries") != null)
                      target.getSNMPQuerier().setRetries(subconf.getInt("snmp/retries"));                 
                    if (subconf.getString("snmp/security") != null && subconf.getString("snmp/security").equals("NOAUTH_NOPRIV"))
                      target.getSNMPQuerier().setSec(SecurityLevel.NOAUTH_NOPRIV);
                    if (subconf.getString("snmp/security") != null && subconf.getString("snmp/security").equals("AUTH_NOPRIV"))
                      target.getSNMPQuerier().setSec(SecurityLevel.AUTH_NOPRIV);
                    if (subconf.getString("snmp/security") != null && subconf.getString("snmp/security").equals("AUTH_PRIV"))
                      target.getSNMPQuerier().setSec(SecurityLevel.AUTH_PRIV);                 
                    if (subconf.getString("snmp/timeout") != null)
                      target.getSNMPQuerier().setTimeout(subconf.getInt("snmp/timeout"));
                    target.getSNMPQuerier().update();
                  }
                }
              }

              if (subconf.getProperty("@targetType").equals("ipv6")) {
                final String address = subconf.getString("address");

                java.util.List<String> parents = (java.util.List<String>) subconf.getList("parent[@parentType='group']");
                if (parents.size() != 0) for (final String parent : parents) {
                  final TargetGroup foo = new TargetGroup("temporary", parent);
                  final TargetGroup target_parent = (TargetGroup) getCanonicalInstance(foo);
                  if (target_parent == foo) log.error("Initial configuration: parent does not exist");
                  else {
                    final TargetIPv6 target = new TargetIPv6("added by initial configuration", GenericTools.stringToInet6Address(address), snmp_manager);
                    target.addTarget(gui, target_parent);
                  }
                }
              }

              if (subconf.getProperty("@targetType").equals("ipv4range")) {
                final String begin = subconf.getString("begin");
                final String end = subconf.getString("end");

                java.util.List<String> parents = (java.util.List<String>) subconf.getList("parent[@parentType='group']");
                if (parents.size() != 0) for (final String parent : parents) {
                  final TargetGroup foo = new TargetGroup("temporary", parent);
                  final TargetGroup target_parent = (TargetGroup) getCanonicalInstance(foo);
                  if (target_parent == foo) log.error("Initial configuration: parent does not exist");
                  else {
                    final TargetIPv4Range target = new TargetIPv4Range("added by initial configuration", GenericTools.stringToInet4Address(begin), GenericTools.stringToInet4Address(end));
                    target.addTarget(gui, target_parent);
                  }
                }
              }

              if (subconf.getProperty("@targetType").equals("ipv4subnet")) {
                final String network = subconf.getString("network");
                final String netmask = subconf.getString("netmask");

                java.util.List<String> parents = (java.util.List<String>) subconf.getList("parent[@parentType='group']");
                if (parents.size() != 0) for (final String parent : parents) {
                  final TargetGroup foo = new TargetGroup("temporary", parent);
                  final TargetGroup target_parent = (TargetGroup) getCanonicalInstance(foo);
                  if (target_parent == foo) log.error("Initial configuration: parent does not exist");
                  else {
                    final TargetIPv4Subnet target = new TargetIPv4Subnet("added by initial configuration", GenericTools.stringToInet4Address(network), GenericTools.stringToInet4Address(netmask));
                    target.addTarget(gui, target_parent);
                  }
                }
              }
            }

            session.getTransaction().commit();
          }
          catch(final ConfigurationException ex) {
            log.warn("Exception", ex);
            session.getTransaction().rollback();
          }
          catch(final AlgorithmException ex) {
            log.error("Exception", ex);
            session.getTransaction().rollback();
          }
          catch(final UnknownHostException ex) {
            log.error("Exception", ex);
            session.getTransaction().rollback();
          }
        }
      }
    });
  }

  /**
   * Moves the application to the top of the drawing order.
   * @param none.
   * @return void.
   */
  public void showGUI() {
    asyncExecIfNeeded(new Runnable() {
      public void run() {
        shell.setActive();
      }
    });
  }
}
TOP

Related Classes of net.fenyo.gnetwatch.GUI.GUI

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.