com.zeroc.IceGridGUI.ApplicationPane.java Source code

Java tutorial

Introduction

Here is the source code for com.zeroc.IceGridGUI.ApplicationPane.java

Source

// **********************************************************************
//
// Copyright (c) 2003-2016 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************

package com.zeroc.IceGridGUI;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.plaf.SplitPaneUI;
import javax.swing.plaf.basic.BasicSplitPaneUI;
import javax.swing.tree.TreeCellRenderer;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;

import com.jgoodies.forms.factories.Borders;

import com.zeroc.IceGridGUI.Application.Editor;
import com.zeroc.IceGridGUI.Application.Root;
import com.zeroc.IceGridGUI.Application.TreeNode;

public class ApplicationPane extends JSplitPane implements Tab {
    @Override
    public void updateUI() {
        super.updateUI();
        setEmptyDividerBorder();
    }

    @Override
    public void selected() {
        Coordinator c = _root.getCoordinator();

        c.getShowLiveDeploymentFiltersAction().setEnabled(false);
        c.getCloseApplicationAction().setEnabled(true);

        c.getSaveAction()
                .setEnabled(_root.needsSaving() && (_root.isLive() && c.connectedToMaster() || _root.hasFile()));
        c.getDiscardUpdatesAction().setEnabled(_root.needsSaving() && (_root.isLive() || _root.hasFile()));

        if (_root.isLive()) {
            c.getSaveToRegistryAction().setEnabled(_root.needsSaving() && c.connectedToMaster());
            c.getSaveToRegistryWithoutRestartAction().setEnabled(_root.needsSaving() && c.connectedToMaster());
        } else {
            c.getSaveToRegistryAction().setEnabled(c.connectedToMaster());
            c.getSaveToRegistryWithoutRestartAction().setEnabled(c.connectedToMaster());
        }
        c.getSaveToFileAction().setEnabled(true);

        c.getBackAction().setEnabled(_previousNodes.size() > 0);
        c.getForwardAction().setEnabled(_nextNodes.size() > 0);
        c.showActions(_currentNode);
    }

    @Override
    public void refresh() {
        if (_currentNode != null) {
            _currentEditor = _currentNode.getEditor();
            if (_root.getCoordinator().getCurrentTab() == this) {
                //
                // Refresh actions as well
                //
                _root.getCoordinator().showActions(_currentNode);
            }
        }
    }

    @Override
    public void showNode(TreeNodeBase node) {
        TreeNode newNode = (TreeNode) node;

        if (newNode != _currentNode) {
            if (_currentNode != null && _currentNode.isEphemeral() && _root.hasNode(_currentNode)) {
                _currentNode.destroy();
                _currentNode = null;
            }

            if (newNode == null) {
                _currentNode = null;
                showCurrentNode();
            } else {
                if (_currentNode != null && _root.hasNode(_currentNode)) {
                    _previousNodes.add(_currentNode);
                    while (_previousNodes.size() >= HISTORY_MAX_SIZE) {
                        _previousNodes.removeFirst();
                    }
                    _root.getCoordinator().getBackAction().setEnabled(true);
                }
                _nextNodes.clear();
                _root.getCoordinator().getForwardAction().setEnabled(false);
                _currentNode = newNode;
                showCurrentNode();
            }
        } else {
            _currentEditor = _currentNode.getEditor();
            if (_root.getCoordinator().getCurrentTab() == this) {
                //
                // Refresh actions as well
                //
                _root.getCoordinator().showActions(_currentNode);
            }
        }
    }

    @Override
    public void back() {
        //
        // Auto-apply changes
        //
        if (_currentEditor != null && !_currentEditor.save(false)) {
            return;
        }

        TreeNode previousNode = null;
        do {
            previousNode = _previousNodes.removeLast();
        } while (_previousNodes.size() > 0 && (previousNode == _currentNode || !_root.hasNode(previousNode)));

        if (_previousNodes.size() == 0) {
            _root.getCoordinator().getBackAction().setEnabled(false);
        }

        if (previousNode != _currentNode) {
            if (_currentNode != null) {
                _nextNodes.addFirst(_currentNode);
                _root.getCoordinator().getForwardAction().setEnabled(true);
            }

            _currentNode = previousNode;
            _root.disableSelectionListener();
            _root.setSelectedNode(_currentNode);
            _root.enableSelectionListener();
            showCurrentNode();
        }
    }

    @Override
    public void forward() {
        if (_currentEditor != null && !_currentEditor.save(false)) {
            return;
        }

        TreeNode nextNode = null;
        do {
            nextNode = _nextNodes.removeFirst();
        } while (_nextNodes.size() > 0 && (nextNode == _currentNode || !_root.hasNode(nextNode)));

        if (_nextNodes.size() == 0) {
            _root.getCoordinator().getForwardAction().setEnabled(false);
        }

        if (nextNode != _currentNode) {
            if (_currentNode != null) {
                _previousNodes.add(_currentNode);
                _root.getCoordinator().getBackAction().setEnabled(true);
            }

            _currentNode = nextNode;
            _root.disableSelectionListener();
            _root.setSelectedNode(_currentNode);
            _root.enableSelectionListener();
            showCurrentNode();
        }
    }

    public Root getRoot() {
        return _root;
    }

    //
    // E.g. to replace an ephemeral root
    //
    public void setRoot(Root newRoot) {
        boolean reset = (_root != null);

        if (reset) {
            ToolTipManager.sharedInstance().unregisterComponent(_root.getTree());
            _currentNode = null;
            _previousNodes.clear();
            _nextNodes.clear();
        }

        _root = newRoot;
        _root.setPane(this);

        //
        // Tree display
        //
        TreeCellRenderer renderer = new CellRenderer();
        PopupListener popupListener = new PopupListener();

        JTree tree = _root.getTree();

        tree.setBorder(new EmptyBorder(5, 5, 5, 5));
        tree.setCellRenderer(renderer);
        ToolTipManager.sharedInstance().registerComponent(tree);
        tree.addMouseListener(popupListener);

        tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);

        tree.addTreeSelectionListener(new SelectionListener());

        tree.setRootVisible(true);

        JScrollPane leftScroll = new JScrollPane(tree, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        leftScroll.setBorder(Borders.EMPTY);

        _leftPane.setContent(leftScroll);

        if (reset) {
            _root.getCoordinator().getMainPane().resetIcon(_root);
            _leftPane.validate();
            _leftPane.repaint();
        }
    }

    @Override
    public void save() {
        if (_currentEditor == null || _currentEditor.save(true)) {
            _root.save();
        }
    }

    @Override
    public void saveToRegistry(boolean restart) {
        if (_currentEditor == null || _currentEditor.save(true)) {
            _root.saveToRegistry(restart);
        }
    }

    @Override
    public void saveToFile() {
        if (_currentEditor == null || _currentEditor.save(true)) {
            _root.saveToFile();
        }
    }

    @Override
    public void discardUpdates() {
        _root.discardUpdates();
    }

    @Override
    public boolean close() {
        _root.getCoordinator().getMainPane().remove(this);
        return true;
    }

    public boolean applyUpdates(boolean refresh) {
        if (_currentEditor == null) {
            return true;
        } else {
            return _currentEditor.save(refresh);
        }
    }

    private void registerAction(Coordinator c, int index) {
        Action action = c.getActionsForMenu().get(index);

        javax.swing.ActionMap am = _leftPane.getActionMap();
        javax.swing.InputMap im = _leftPane.getInputMap();

        im.put((KeyStroke) action.getValue(Action.ACCELERATOR_KEY), (String) action.getValue(Action.NAME));
        am.put(action.getValue(Action.NAME), action);
    }

    ApplicationPane(Root root) {
        super(JSplitPane.HORIZONTAL_SPLIT, true);
        setBorder(new EmptyBorder(10, 10, 10, 10));

        _leftPane = new SimpleInternalFrame("Descriptors");
        _leftPane.setPreferredSize(new Dimension(280, 350));
        Coordinator c = root.getCoordinator();
        registerAction(c, TreeNode.COPY);
        registerAction(c, TreeNode.PASTE);
        registerAction(c, TreeNode.DELETE);

        //
        // Right pane
        //
        _propertiesFrame = new SimpleInternalFrame("Properties");

        setLeftComponent(_leftPane);
        setRightComponent(_propertiesFrame);

        setRoot(root);
    }

    private void showCurrentNode() {
        _root.getCoordinator().showActions(_currentNode);

        if (_currentNode == null) {
            Component oldContent = _propertiesFrame.getContent();
            if (oldContent != null) {
                _propertiesFrame.remove(oldContent);
            }
            _propertiesFrame.setTitle("Properties");
            _propertiesFrame.setToolBar(null);
            _currentEditor = null;
        } else {
            _currentEditor = _currentNode.getEditor();
            Component currentProperties = _currentEditor.getProperties();
            _propertiesFrame.setContent(currentProperties);
            _propertiesFrame.setTitle(currentProperties.getName());
            _propertiesFrame.setToolBar(_currentEditor.getToolBar());
        }
        _propertiesFrame.validate();
        _propertiesFrame.repaint();
    }

    private void setEmptyDividerBorder() {
        SplitPaneUI splitPaneUI = getUI();
        if (splitPaneUI instanceof BasicSplitPaneUI) {
            BasicSplitPaneUI basicUI = (BasicSplitPaneUI) splitPaneUI;
            basicUI.getDivider().setBorder(BorderFactory.createEmptyBorder());
        }
    }

    private class PopupListener extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            maybeShowPopup(e);
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            maybeShowPopup(e);
        }

        private void maybeShowPopup(MouseEvent e) {
            if (e.isPopupTrigger()) {
                JTree tree = (JTree) e.getComponent();

                TreePath path = tree.getPathForLocation(e.getX(), e.getY());

                if (path != null) {
                    TreeNode node = (TreeNode) path.getLastPathComponent();
                    JPopupMenu popup = node.getPopupMenu();
                    if (popup != null) {
                        popup.show(tree, e.getX(), e.getY());
                    }
                }
            }
        }
    }

    private class SelectionListener implements TreeSelectionListener {
        @Override
        public void valueChanged(TreeSelectionEvent e) {
            if (_root.isSelectionListenerEnabled()) {
                //
                // Auto-apply changes
                //
                if (_currentEditor != null && !_currentEditor.save(false)) {
                    //
                    // Go back to this path
                    //
                    _root.disableSelectionListener();
                    _root.setSelectedNode(_currentEditor.getTarget());
                    _root.enableSelectionListener();
                } else {
                    if (e.isAddedPath()) {
                        TreePath path = e.getPath();

                        if (path == null) {
                            showNode(null);
                        } else {
                            TreeNode node = (TreeNode) path.getLastPathComponent();
                            Root root = node.getRoot();
                            if (root.hasNode(node)) {
                                showNode(node);
                            } else {
                                node = root.findNodeLike(path, false);
                                if (node == null) {
                                    node = root;
                                }
                                root.setSelectedNode(node);
                            }
                        }
                    } else {
                        showNode(null);
                    }
                }
            }
        }
    }

    private Root _root;
    private SimpleInternalFrame _leftPane;
    private SimpleInternalFrame _propertiesFrame;

    //
    // back/forward navigation
    //
    private java.util.LinkedList<TreeNode> _previousNodes = new java.util.LinkedList<>();
    private java.util.LinkedList<TreeNode> _nextNodes = new java.util.LinkedList<>();

    private TreeNode _currentNode;
    private Editor _currentEditor;

    static private final int HISTORY_MAX_SIZE = 20;
}