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

org.bidib.wizard.mvc.main.view.MainView Maven / Gradle / Ivy

There is a newer version: 2.0.0-M1
Show newest version
package org.bidib.wizard.mvc.main.view;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Collection;
import java.util.LinkedList;

import javax.swing.JButton;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionListener;

import org.apache.commons.lang3.StringUtils;
import org.bidib.wizard.comm.AnalogPortStatus;
import org.bidib.wizard.comm.CommunicationFactory;
import org.bidib.wizard.comm.InputPortStatus;
import org.bidib.wizard.comm.LightPortStatus;
import org.bidib.wizard.comm.MotorPortStatus;
import org.bidib.wizard.comm.ServoPortStatus;
import org.bidib.wizard.comm.SoundPortStatus;
import org.bidib.wizard.comm.SwitchPortStatus;
import org.bidib.wizard.comm.listener.CommunicationListener;
import org.bidib.wizard.locale.Resources;
import org.bidib.wizard.main.DefaultApplicationContext;
import org.bidib.wizard.mvc.common.model.PreferencesPortType;
import org.bidib.wizard.mvc.console.model.ConsoleModel;
import org.bidib.wizard.mvc.main.model.MainModel;
import org.bidib.wizard.mvc.main.model.listener.BacklightPortListener;
import org.bidib.wizard.mvc.main.model.listener.CvDefinitionRequestListener;
import org.bidib.wizard.mvc.main.model.listener.OutputListener;
import org.bidib.wizard.mvc.main.model.listener.PortListener;
import org.bidib.wizard.mvc.main.model.listener.ServoPortListener;
import org.bidib.wizard.mvc.main.model.listener.SwitchPortListener;
import org.bidib.wizard.mvc.main.view.component.DefaultBusyFrame;
import org.bidib.wizard.mvc.main.view.menu.MainMenuBar;
import org.bidib.wizard.mvc.main.view.menu.listener.MainMenuListener;
import org.bidib.wizard.mvc.main.view.panel.MainPanel;
import org.bidib.wizard.mvc.main.view.panel.listener.AccessoryListListener;
import org.bidib.wizard.mvc.main.view.panel.listener.AccessoryTableListener;
import org.bidib.wizard.mvc.main.view.panel.listener.MacroListListener;
import org.bidib.wizard.mvc.main.view.panel.listener.MacroTableListener;
import org.bidib.wizard.mvc.main.view.panel.listener.NodeListListener;
import org.bidib.wizard.mvc.main.view.panel.listener.StatusListener;
import org.bidib.wizard.mvc.main.view.statusbar.StatusBar;
import org.bidib.wizard.mvc.preferences.model.Preferences;
import org.bidib.wizard.mvc.simulation.controller.SimulationController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.vlsolutions.swing.docking.DockingDesktop;
import com.vlsolutions.swing.toolbars.ToolBarConstraints;
import com.vlsolutions.swing.toolbars.ToolBarContainer;
import com.vlsolutions.swing.toolbars.ToolBarPanel;
import com.vlsolutions.swing.toolbars.VLToolBar;

public class MainView extends DefaultBusyFrame {
    private static final long serialVersionUID = 1L;

    private static final Logger LOGGER = LoggerFactory.getLogger(MainView.class);

    private MainMenuBar mainMenuBar;

    private MainPanel mainPanel;

    private StatusBar statusBar;

    private final Collection toolbarListeners = new LinkedList();

    private JButton connectButton;

    private JButton disconnectButton;

    private JButton allBoosterOffButton;

    private JButton simulationButton;

    private DockingDesktop desktop;

    private MainModel mainModel;

    private VLToolBar toolbarSimulation;

    private ToolBarPanel topToolBarPanel;

    public MainView(MainModel model) {
        this.mainModel = model;
        setTitle(Resources.getString(getClass(), "title"));

    }

    public void createComponents() {

        desktop = new DockingDesktop();

        mainMenuBar = new MainMenuBar(mainModel, desktop);
        setJMenuBar(mainMenuBar);

        // create and install the container
        ToolBarContainer container = ToolBarContainer.createDefaultContainer(true, false, false, false);
        topToolBarPanel = container.getToolBarPanelAt(BorderLayout.NORTH);

        DefaultApplicationContext.getInstance().register("topToolBarPanel", topToolBarPanel);
        DefaultApplicationContext.getInstance().register("desktop", desktop);

        // create and register the toolbars
        VLToolBar toolbarBidib = new VLToolBar("bidib");
        topToolBarPanel.add(toolbarBidib, new ToolBarConstraints(0, 0)); // first row, first column
        addBidibButtons(toolbarBidib);

        toolbarSimulation = new VLToolBar("simulation");
        topToolBarPanel.add(toolbarSimulation, new ToolBarConstraints(0, 1)); // first row, first column
        addSimulationButtons(toolbarSimulation, desktop);

        // only show simulation toolbar in simulation mode
        boolean simulationMode = PreferencesPortType.isSimulation(Preferences.getInstance().getSelectedPortType());
        toolbarSimulation.setVisible(simulationMode);

        // add the desktop to the center
        container.add(desktop, BorderLayout.CENTER);

        // toolbar container becomes the only one component
        getContentPane().add(container);

        // create and register the console model
        ConsoleModel.getConsoleModel();

        // create the status bar
        statusBar = new StatusBar(mainModel);
        DefaultApplicationContext.getInstance().register("statusBar", statusBar);

        // create the main panel
        mainPanel = new MainPanel(mainModel);
        mainPanel.create(desktop);

        // Add the status bar.
        getContentPane().add(statusBar, BorderLayout.SOUTH);

        CommunicationFactory.addCommunicationListener(new CommunicationListener() {

            @Override
            public void status(String statusText, int displayDuration) {
            }

            @Override
            public void opened(String port) {
                disconnectButton.setEnabled(true);
                allBoosterOffButton.setEnabled(true);
                connectButton.setEnabled(false);

                mainMenuBar.opened(port);
            }

            @Override
            public void initialized() {
            }

            @Override
            public void closed(final String port) {
                if (SwingUtilities.isEventDispatchThread()) {
                    disconnectButton.setEnabled(false);
                    allBoosterOffButton.setEnabled(false);
                    connectButton.setEnabled(true);

                    mainMenuBar.closed(port);
                }
                else {
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            disconnectButton.setEnabled(false);
                            allBoosterOffButton.setEnabled(false);
                            connectButton.setEnabled(true);

                            mainMenuBar.closed(port);
                        }
                    });
                }
            }
        });

        Preferences.getInstance().addPropertyChangeListener(Preferences.PROPERTY_SELECTED_PORTTYPE,
            new PropertyChangeListener() {

                @Override
                public void propertyChange(PropertyChangeEvent evt) {

                    if (toolbarSimulation != null) {
                        try {
                            PreferencesPortType portType = Preferences.getInstance().getSelectedPortType();
                            LOGGER
                                .info(
                                    "The selected port type has changed, enable/disable the simulation toolbar, portType: {}",
                                    portType);
                            if (portType != null) {
                                toolbarSimulation.setVisible(PreferencesPortType.isSimulation(portType));
                            }
                        }
                        catch (Exception ex) {
                            LOGGER.warn("Change visibility of simulation toolbar failed.", ex);
                        }
                    }
                }
            });
    }

    public void addToolBarListener(MainMenuListener l) {
        toolbarListeners.add(l);
    }

    private void fireConnect() {
        for (MainMenuListener l : toolbarListeners) {
            l.connect();
        }
    }

    private void fireDisconnect() {
        for (MainMenuListener l : toolbarListeners) {
            l.disconnect();
        }
    }

    private void fireAllBoosterOff() {
        for (MainMenuListener l : toolbarListeners) {
            l.allBoosterOff();
        }
    }

    /**
     * @return the desktop
     */
    public DockingDesktop getDesktop() {
        return desktop;
    }

    private void addBidibButtons(VLToolBar toolbar) {
        connectButton =
            Resources.makeNavigationButton("32x32/connect.png",
                Resources.getString(getClass(), "toolbar.bidib.connect"),
                Resources.getString(getClass(), "toolbar.bidib.connect.alttext"));
        connectButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                fireConnect();
            }
        });
        toolbar.add(connectButton);

        disconnectButton =
            Resources.makeNavigationButton("32x32/disconnect.png",
                Resources.getString(getClass(), "toolbar.bidib.disconnect"),
                Resources.getString(getClass(), "toolbar.bidib.disconnect.alttext"));
        disconnectButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                fireDisconnect();
            }
        });
        disconnectButton.setEnabled(false);
        toolbar.add(disconnectButton);

        toolbar.addSeparator();

        allBoosterOffButton =
            Resources.makeNavigationButton("32x32/boosterOff.png",
                Resources.getString(getClass(), "toolbar.bidib.all-booster-off"),
                Resources.getString(getClass(), "toolbar.bidib.all-booster-off.alttext"));
        allBoosterOffButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                fireAllBoosterOff();
            }
        });
        allBoosterOffButton.setEnabled(false);
        toolbar.add(allBoosterOffButton);
    }

    private void addSimulationButtons(VLToolBar toolbar, final DockingDesktop desktop) {
        simulationButton =
            Resources.makeNavigationButton("32x32/sim-mode.png",
                Resources.getString(getClass(), "toolbar.simulation.open"),
                Resources.getString(getClass(), "toolbar.simulation.open.alttext"));
        simulationButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // create the simulation controller
                if (simulationController == null) {
                    simulationController = new SimulationController(MainView.this, desktop);

                    simulationController.start(mainModel);
                }
                if (mainModel.getSelectedNode() != null) {
                    simulationController.activate(mainModel.getSelectedNode());
                }
            }
        });
        toolbar.add(simulationButton);
    }

    private SimulationController simulationController;

    public void addAccessoryListListener(AccessoryListListener l) {
        mainPanel.addAccessoryListListener(l);
    }

    public void addAccessoryListSelectionListener(ListSelectionListener l) {
        mainPanel.addAccessoryListSelectionListener(l);
    }

    public void addAccessoryTableListener(AccessoryTableListener l) {
        mainPanel.addAccessoryTableListener(l);
    }

    public void addAnalogPortListener(OutputListener l) {
        mainPanel.addAnalogPortListener(l);
    }

    public void addBoosterStatusListener(StatusListener l) {
        mainPanel.addBoosterStatusListener(l);
    }

    public void addInputPortListener(PortListener l) {
        mainPanel.addInputPortListener(l);
    }

    public void addLightPortListener(PortListener l) {
        mainPanel.addLightPortListener(l);
    }

    public void addBacklightPortListener(BacklightPortListener l) {
        mainPanel.addBacklightPortListener(l);
    }

    public void addMacroListListener(MacroListListener l) {
        mainPanel.addMacroListListener(l);
    }

    public void addMacroListSelectionListener(ListSelectionListener l) {
        mainPanel.addMacroListSelectionListener(l);
    }

    public void addMacroTableListener(MacroTableListener l) {
        mainPanel.addMacroTableListener(l);
    }

    public void addMainMenuListener(MainMenuListener l) {
        mainMenuBar.addMenuListener(l);
    }

    public void addMotorPortListener(OutputListener l) {
        mainPanel.addMotorPortListener(l);
    }

    public void addNodeListListener(NodeListListener l) {
        mainPanel.addNodeListListener(l);
    }

    public void addNodeListSelectionListener(ListSelectionListener l) {
        mainPanel.addNodeListSelectionListener(l);
    }

    public void addServoPortListener(ServoPortListener l) {
        mainPanel.addServoPortListener(l);
    }

    public void addSoundPortListener(OutputListener l) {
        mainPanel.addSoundPortListener(l);
    }

    public void addStatusListener(StatusListener l) {
        statusBar.addStatusListener(l);
    }

    public void addSwitchPortListener(SwitchPortListener l) {
        mainPanel.addSwitchPortListener(l);
    }

    public void addCvDefinitionRequestListener(CvDefinitionRequestListener l) {
        mainPanel.addCvDefinitionRequestListener(l);
    }

    public void prepareFrame() {

        setMinimumSize(new Dimension(1024, 600));

        String encodedWindowPosition = Preferences.getInstance().getWindowPosition();
        Dimension maxSize = Toolkit.getDefaultToolkit().getScreenSize();
        if (StringUtils.isBlank(encodedWindowPosition)) {

            setPreferredSize(new Dimension(Math.min(maxSize.width, 1400), Math.min(maxSize.height, 800)));
        }
        else {
            // Restore the window position from settings
            Point windowPos = Preferences.getWindowPos(encodedWindowPosition);
            Dimension windowSize = Preferences.getWindowSize(encodedWindowPosition);
            int extendedState = Preferences.getExtendedState(encodedWindowPosition);
            LOGGER.info("Restore frame at pos: {}, size: {}, extendedState: {}", windowPos, windowSize, extendedState);

            setExtendedState(extendedState);
            if (windowPos != null) {
                if (windowPos.x > (maxSize.width - 20)) {
                    windowPos.x = maxSize.width - 20;
                }
                if (windowPos.y > (maxSize.height - 20)) {
                    windowPos.y = maxSize.height - 20;
                }

                setLocation(windowPos);
            }

            if (windowSize != null) {
                setPreferredSize(windowSize);
            }
            else {
                setPreferredSize(new Dimension(Math.min(maxSize.width, 1400), Math.min(maxSize.height, 800)));
            }
        }

        pack();
    }

    public void saveWindowPosition() {
        LOGGER.info("Save the window position.");
        try {
            Preferences.getInstance().setWindowPosition(
                Preferences.encodedWindowPosition(getLocation(), getSize(), getExtendedState()));
            Preferences.getInstance().save(null);
        }
        catch (Exception ex) {
            LOGGER.warn("Save window position during shutdown failed.", ex);
        }
    }

    public void setWindowListener(WindowListener l) {
        addWindowListener(l);
    }

    /**
     * Display a text in the statusbar.
     * 
     * @param statusText
     *            the text to display
     * @param displayDuration
     *            Time wait for clearing the message (in seconds). Any value lesser than 1 disable this functionality.
     */
    public void setStatusText(String statusText, int displayDuration) {
        if (statusBar != null) {
            statusBar.setStatus(statusText, displayDuration);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy