public GraphDesktopController(
      GraphDesktopListener listener,
      ISession session,
      GraphPlugin plugin,
      ModeManager modeManager,
      boolean showDndDesktopImageAtStartup) {
    _listener = listener;
    _session = session;
    _plugin = plugin;
    _graphPluginResources = new GraphPluginResources(_plugin);

    ImageIcon startUpImage = null;

    if (showDndDesktopImageAtStartup) {
      startUpImage = _graphPluginResources.getIcon(GraphPluginResources.IKeys.DND);
    }

    _desktopPane = new GraphDesktopPane(_session.getApplication(), startUpImage);
    _desktopPane.setBackground(Color.white);

    _modeManager = modeManager;

    DropTarget dt = new DropTarget();

    try {
      dt.addDropTargetListener(
          new DropTargetAdapter() {
            public void drop(DropTargetDropEvent dtde) {
              onTablesDroped(dtde);
            }
          });
    } catch (TooManyListenersException e) {
      throw new RuntimeException(e);
    }

    _desktopPane.setDropTarget(dt);

    _desktopPane.addMouseListener(
        new MouseAdapter() {
          public void mouseClicked(MouseEvent e) {
            onMouseClicked(e);
          }

          public void mousePressed(MouseEvent e) {
            onMousePressed(e);
          }

          public void mouseReleased(MouseEvent e) {
            onMouseReleased(e);
          }
        });

    _desktopPane.addMouseMotionListener(
        new MouseMotionAdapter() {
          public void mouseDragged(MouseEvent e) {
            onMouseDragged(e);
          }
        });

    createPopUp();
  }
  private void createPopUp() {
    _popUp = new JPopupMenu();

    // i18n[graph.saveGraph=Save graph]
    _mnuSaveGraph = new JMenuItem(s_stringMgr.getString("graph.saveGraph"));
    _mnuSaveGraph.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            onSaveGraph();
          }
        });

    // i18n[graph.renameGraph=Rename graph]
    _mnuRenameGraph = new JMenuItem(s_stringMgr.getString("graph.renameGraph"));
    _mnuRenameGraph.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            onRenameGraph();
          }
        });

    // i18n[graph.removeGraph=Remove graph]
    _mnuRemoveGraph = new JMenuItem(s_stringMgr.getString("graph.removeGraph"));
    _mnuRemoveGraph.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            onRemoveGraph();
          }
        });

    // i18n[graph.refreshAllTables=Refresh all tables]
    _mnuRefreshAllTables = new JMenuItem(s_stringMgr.getString("graph.refreshAllTables"));
    _mnuRefreshAllTables.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            onRefreshAllTables();
          }
        });

    // i18n[graph.scriptAllTables=Script all tables]
    _mnuScriptAllTables = new JMenuItem(s_stringMgr.getString("graph.scriptAllTables"));
    _mnuScriptAllTables.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            onScriptAllTables();
          }
        });

    /////////////////////////////////////////////////////////
    // Tablegroups
    // i18n[graph.scriptAllTables=Script all tables]
    _mnuSelectAllTables = new JMenuItem(s_stringMgr.getString("graph.selectAllTables"));
    _mnuSelectAllTables.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            onSelectAllTables();
          }
        });

    // i18n[graph.scriptAllTables=Script all tables]
    _mnuSelectTablesByName = new JMenuItem(s_stringMgr.getString("graph.selectTablesByName"));
    _mnuSelectTablesByName.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            onSelectTablesByName();
          }
        });
    /////////////////////////////////////////////////////////

    // i18n[graph.showConstr=Show constraint names]
    _mnuShowConstraintNames = new JCheckBoxMenuItem(s_stringMgr.getString("graph.showConstr"));
    _mnuShowConstraintNames.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            _desktopPane.repaint();
          }
        });

    // i18n[graph.showQualifiedTableNames=Show qualified table names]
    _mnuShowQualifiedTableNames =
        new JCheckBoxMenuItem(s_stringMgr.getString("graph.showQualifiedTableNames"));
    _mnuShowQualifiedTableNames.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            onShowQualifiedTableNames();
          }
        });

    ImageIcon toWInIcon = _graphPluginResources.getIcon(GraphPluginResources.IKeys.TO_WINDOW);
    _mnuToggleWindowTab = new JMenuItem(s_stringMgr.getString("graph.toggleWindowTab"), toWInIcon);
    _mnuToggleWindowTab.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            onToggleWindowTab();
          }
        });

    _mnuAllTablesDbOrder = new JMenuItem(s_stringMgr.getString("graph.allTablesDbOrderRequested"));
    _mnuAllTablesDbOrder.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            onAllTablesDbOrder();
          }
        });

    _mnuAllTablesByNameOrder =
        new JMenuItem(s_stringMgr.getString("graph.allTablesByNameOrderRequested"));
    _mnuAllTablesByNameOrder.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            onAllTablesByNameOrder();
          }
        });

    _mnuAllTablesPkConstOrder =
        new JMenuItem(s_stringMgr.getString("graph.allTablesPkConstOrderRequested"));
    _mnuAllTablesPkConstOrder.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            onAllTablesPkConstOrder();
          }
        });

    _mnuAllFilteredSelectedOrder =
        new JMenuItem(s_stringMgr.getString("graph.allTablesFilteredSelectedOrderRequested"));
    _mnuAllFilteredSelectedOrder.addActionListener(
        new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            onAllTablesFilteredSelectedOrder();
          }
        });

    _popUp.add(_mnuSaveGraph);
    _popUp.add(_mnuRenameGraph);
    _popUp.add(_mnuRemoveGraph);
    _popUp.add(new JSeparator());
    _popUp.add(_mnuRefreshAllTables);
    _popUp.add(_mnuScriptAllTables);
    _popUp.add(new JSeparator());
    /////////////////////////////////////////////////////////
    // Tablegroups
    _popUp.add(_mnuSelectAllTables);
    _popUp.add(_mnuSelectTablesByName);
    _popUp.add(new JSeparator());
    /////////////////////////////////////////////////////////
    _popUp.add(_mnuAllTablesDbOrder);
    _popUp.add(_mnuAllTablesByNameOrder);
    _popUp.add(_mnuAllTablesPkConstOrder);
    _popUp.add(_mnuAllFilteredSelectedOrder);
    _popUp.add(new JSeparator());
    _popUp.add(_mnuShowConstraintNames);
    _popUp.add(_mnuShowQualifiedTableNames);
    _popUp.add(new JSeparator());
    _popUp.add(_mnuToggleWindowTab);
    _popUp.add(new JSeparator());
    _popUp.add(_modeManager.getModeMenuItem());

    _modeManager.addModeManagerListener(
        new ModeManagerListener() {
          @Override
          public void modeChanged(Mode newMode) {
            _popUp.setVisible(false);
          }
        });

    _popUp.addPopupMenuListener(
        new PopupMenuListener() {
          @Override
          public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
            onPopupMenuWillBecomeInvisible();
          }

          @Override
          public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}

          @Override
          public void popupMenuCanceled(PopupMenuEvent e) {}
        });
  }