salomon.engine.controller.gui.project.ProjectManagerGUI.java Source code

Java tutorial

Introduction

Here is the source code for salomon.engine.controller.gui.project.ProjectManagerGUI.java

Source

/*
 * Copyright (C) 2004 Salomon Team
 *
 * This file is part of Salomon.
 *
 * Salomon is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * Salomon 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with Salomon; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * 
 */

package salomon.engine.controller.gui.project;

import java.text.DateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import org.apache.log4j.Logger;

import salomon.engine.Messages;
import salomon.engine.controller.gui.ControllerFrame;
import salomon.engine.controller.gui.common.action.ActionManager;
import salomon.engine.controller.gui.task.SettingsDialog;
import salomon.engine.plugin.PlatformUtil;
import salomon.engine.project.IProject;
import salomon.engine.project.IProjectManager;
import salomon.engine.project.Project;
import salomon.engine.project.ProjectInfo;
import salomon.engine.project.ProjectManager;
import salomon.engine.project.event.ProjectEvent;
import salomon.engine.project.event.ProjectListener;
import salomon.platform.exception.PlatformException;
import salomon.util.gui.DBDataTable;
import salomon.util.gui.Utils;
import salomon.util.gui.validation.IComponentFactory;
import salomon.util.gui.validation.IValidationModel;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.factories.ButtonBarFactory;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.validation.ValidationResultModel;

/**
 * Class used to manage with projects editing.
 */
public final class ProjectManagerGUI {
    private static final Logger LOGGER = Logger.getLogger(ProjectManagerGUI.class);

    private ActionManager _actionManager;

    private SettingsDialog _agentSettingDialog;

    private JButton _btnConfigureAgents;

    private JButton _btnStartAgents;

    private JButton _btnStopAgents;

    private JCheckBox _chkAgentsEnabled;

    private Modes _currentMode;

    /**
     * 
     * @uml.property name="_parent"
     * @uml.associationEnd multiplicity="(0 1)"
     */
    private ControllerFrame _parent;

    private JPanel _pnlProjectProperties;

    private List<ProjectListener> _projectListeners;

    /**
     * 
     * @uml.property name="_projectManager"
     * @uml.associationEnd multiplicity="(0 1)"
     */
    private ProjectManager _projectManager;

    private SettingsDialog _projectSettingsDialog;

    private JFrame _projectViewerFrame;

    private JTextField _txtProjectCrDate;

    private JTextArea _txtProjectInfo;

    private JTextField _txtProjectLastMod;

    private JTextField _txtProjectName;

    /**
     */
    public ProjectManagerGUI(IProjectManager projectManager) {
        _projectManager = (ProjectManager) projectManager;
        _projectListeners = new LinkedList<ProjectListener>();
    }

    public void addProjectListener(ProjectListener listener) {
        _projectListeners.add(listener);
    }

    public void editProject() {
        try {
            Project project = (Project) _projectManager.getCurrentProject();

            _currentMode = Modes.EDIT;
            // saving project
            this.saveProject(project, false);

            // informing listeners
            fireProjectModified(new ProjectEvent((ProjectInfo) project.getInfo()));

        } catch (PlatformException e) {
            LOGGER.fatal("", e);
            Utils.showErrorMessage(Messages.getString("ERR_CANNOT_SAVE_PROJECT"));
        }
    }

    /**
     * Returns the projectManager.
     * @return The projectManager
     */
    public ProjectManager getProjectManager() {
        return _projectManager;
    }

    public void newProject() {
        try {
            Project project = (Project) _projectManager.createProject();

            _currentMode = Modes.ADD;
            // saving project
            this.saveProject(project, false);

            // informing listeners
            fireProjectCreated(new ProjectEvent((ProjectInfo) project.getInfo()));

            // forcing panel to be rebuilt
            _pnlProjectProperties = null;
        } catch (PlatformException e) {
            LOGGER.fatal("", e);
            Utils.showErrorMessage(Messages.getString("ERR_CANNOT_CREATE_PROJECT"));
        }
    }

    public void openProject() {
        try {
            final int projectId = chooseProject();
            if (projectId > 0) {
                IProject project = _projectManager.getProject(projectId);
                // informing listeners
                //FIXME: 
                //                fireProjectOpened(new ProjectEvent(
                //                        (ProjectInfo) project.getInfo()));
                _parent.refreshGui();
            }
        } catch (Exception e) {
            LOGGER.fatal("", e);
            Utils.showErrorMessage(Messages.getString("ERR_CANNOT_OPEN_PROJECT"));
        }
    }

    public void removeProjectListener(ProjectListener listener) {
        _projectListeners.remove(listener);
    }

    public void saveProject(boolean forceNew) {
        try {
            Project project = (Project) _projectManager.getCurrentProject();

            // saving project
            this.saveProject(project, forceNew);

        } catch (PlatformException e) {
            LOGGER.fatal("", e);
            Utils.showErrorMessage(Messages.getString("ERR_CANNOT_SAVE_PROJECT"));
        }
    }

    public void setActionManager(ActionManager actionManager) {
        _actionManager = actionManager;
    }

    /**
     * @param parent The parent to set.
     */
    public void setParent(ControllerFrame parent) {
        _parent = parent;
    }

    private Thread _agentsRunner;

    public void startProjectAgents() {
        // FIXME:        
        //        LOGGER.info("ProjectManagerGUI.startProjectAgents()");
        //        final IProject project = _projectManager.getCurrentProject();
        //        final IAgentConfig[] agentConfigs = project.getAgentConfigs();
        //        
        //        _agentsRunner = new Thread() {
        //            public void run()
        //            {
        //                for (IAgentConfig config : agentConfigs) {
        //                    config.getAgent().start();
        //                }
        //            }
        //        };
        //        _agentsRunner.start();
    }

    public void stopProjectAgents() {
        //FIXME:        
        //        LOGGER.info("ProjectManagerGUI.stopProjectAgents()");
        //        if (_agentsRunner != null) {
        //            final IProject project = _projectManager.getCurrentProject();
        //            final IAgentConfig[] agentConfigs = project.getAgentConfigs();
        //
        //            for (IAgentConfig config : agentConfigs) {
        //                config.getAgent().stop();
        //            }
        //            LOGGER.debug("Interrupting the agent processing thread");
        //            _agentsRunner.interrupt();
        //            _agentsRunner = null;
        //        }
    }

    public void viewProjects() {
        if (_projectViewerFrame == null) {
            _projectViewerFrame = new JFrame(Messages.getString("TIT_PROJECTS"));
            // FIXME:
            _projectViewerFrame.getContentPane().add(new ProjectSpread(null));
            _projectViewerFrame.pack();
        }
        _projectViewerFrame.setLocation(Utils.getCenterLocation(_projectViewerFrame));
        _projectViewerFrame.setVisible(true);
    }

    private int chooseProject() {
        int projectID = 0;

        try {
            projectID = showProjectList(createProjectsTable());
        } catch (Exception e) {
            LOGGER.fatal("", e);
            Utils.showErrorMessage(Messages.getString("ERR_CANNOT_LOAD_PROJECTS"));
        }

        return projectID;
    }

    private JPanel createProjectPanel() {
        FormLayout layout = new FormLayout("left:pref, 3dlu, right:100dlu, 3dlu, right:20dlu", "");
        DefaultFormBuilder builder = new DefaultFormBuilder(layout);
        builder.setDefaultDialogBorder();
        builder.appendSeparator("Project data");

        builder.append("Project name");
        builder.append(_txtProjectName, 3);
        builder.append("Creation date");
        builder.append(_txtProjectCrDate, 3);
        builder.append("Last mod. date");
        builder.append(_txtProjectLastMod, 3);

        builder.appendSeparator("Agent configuration");
        JPanel agentsRunning = ButtonBarFactory.buildAddRemoveBar(_btnStartAgents, _btnStopAgents);
        builder.append(_btnConfigureAgents);
        builder.append(agentsRunning, 3);

        builder.appendSeparator("Project info");
        builder.append(new JScrollPane(_txtProjectInfo), 5);

        return builder.getPanel();
    }

    private JTable createProjectsTable() throws PlatformException {
        IProject[] projects = _projectManager.getProjects();
        String[] columnNames = new String[] { "ID", "Name", "Info", "Cr. date", "Lm. date" };
        // FIXME: workaround, reimplement this 
        Object[][] data = new Object[projects.length][columnNames.length];

        int i = 0;
        for (IProject project : projects) {
            //FIXME:            ProjectInfo info = (ProjectInfo) project.getInfo();
            //            data[i][0] = info.getId();
            //            data[i][1] = info.getName();
            //            data[i][2] = info.getInfo();
            //            data[i][3] = info.getCreationDate();
            //            data[i][4] = info.getLastModificationDate();

            ++i;
        }

        DBDataTable table = new DBDataTable(data, columnNames);
        return table;
    }

    private void fireProjectCreated(ProjectEvent event) {
        for (ProjectListener listener : _projectListeners) {
            listener.projectCreated(event);
        }
    }

    private void fireProjectModified(ProjectEvent event) {
        for (ProjectListener listener : _projectListeners) {
            listener.projectModified(event);
        }
    }

    private void fireProjectOpened(ProjectEvent event) {
        for (ProjectListener listener : _projectListeners) {
            listener.projectOpened(event);
        }
    }

    private void initComponents() {
        _projectSettingsDialog = new SettingsDialog(_parent, Messages.getString("TIT_EDIT_PROJECT"));
        _projectSettingsDialog.setSeparator("Project settings");

        // project settings panel
        _txtProjectCrDate = new JTextField();
        _txtProjectCrDate.setEnabled(false);
        _txtProjectLastMod = new JTextField();
        _txtProjectLastMod.setEnabled(false);

        _agentSettingDialog = new SettingsDialog(_parent, "Configure agents");
        _agentSettingDialog.setSeparator("Agent configuration");

        _btnConfigureAgents.setText("Configure agents");
        _btnConfigureAgents.setToolTipText("Save project before configuring agents");

        _btnStartAgents = new JButton(_actionManager.getStartAgentsAction());
        _btnStartAgents.setText("Start agents");

        _btnStopAgents = new JButton(_actionManager.getStopAgentsAction());
        _btnStopAgents.setText("Stop agents");

        _chkAgentsEnabled = new JCheckBox("Agents enabled");
        _txtProjectInfo = new JTextArea(3, 10);

    }

    private void saveProject(Project project, boolean forceNew) throws PlatformException {
        if (setProjectProperties(project)) {
            _projectManager.saveProject(forceNew);
            Utils.showInfoMessage(Messages.getString("TT_PROJECT_SAVED"));
            _parent.refreshGui();
        }
    }

    private void setControls(Modes mode) {
        boolean enabled = (mode == Modes.EDIT);
        _chkAgentsEnabled.setEnabled(enabled);
        _btnConfigureAgents.setEnabled(enabled);
    }

    /**
     * Shows dialog which enables to initialize project settings.
     * 
     * @param project
     * @throws PlatformException 
     */
    private boolean setProjectProperties(IProject iProject) throws PlatformException {
        boolean approved = false;
        Project project = (Project) iProject;

        if (_pnlProjectProperties == null) {
            initComponents();

            // validation
            ProjectModel model = new ProjectModel();
            ProjectValidator projectValidator = new ProjectValidator(model, _projectManager);
            PlatformUtil platformUtil = (PlatformUtil) _projectManager.getPlaftormUtil();
            IValidationModel validationModel = platformUtil.getValidationModel(projectValidator);
            IComponentFactory componentFactory = validationModel.getComponentFactory();

            ValidationResultModel resultModel = platformUtil.getValidationResultModel();
            _txtProjectName = componentFactory.createTextField(ProjectModel.PROPERTYNAME_PROJECT_NAME, false);

            // recreating panel with new projectName component
            _pnlProjectProperties = createProjectPanel();

            // setting component for dialog
            _projectSettingsDialog.setSettingsComponent(_pnlProjectProperties);
            _projectSettingsDialog.setValidationModel(resultModel);
        }

        // setting the controls mode appropriately
        setControls(_currentMode);

        String name = project.getInfo().getName();
        String info = project.getInfo().getInfo();
        Date cdate = project.getInfo().getCreationDate();
        String scdate = cdate == null ? ""
                : DateFormat.getDateInstance().format(cdate) + " " + DateFormat.getTimeInstance().format(cdate);
        Date lmdate = project.getInfo().getLastModificationDate();
        String slmdate = lmdate == null ? ""
                : DateFormat.getDateInstance().format(lmdate) + " " + DateFormat.getTimeInstance().format(lmdate);

        _txtProjectName.setText(name == null ? "" : name);
        _txtProjectInfo.setText(info == null ? "" : info);
        _txtProjectCrDate.setText(scdate == null ? "" : scdate);
        _txtProjectLastMod.setText(slmdate == null ? "" : slmdate);

        if (_projectSettingsDialog.showSettingsDialog()) {
            project.getInfo().setName(_txtProjectName.getText());
            project.getInfo().setInfo(_txtProjectInfo.getText());
            approved = true;
        }
        return approved;
    }

    private int showProjectList(JTable table) {
        int projectID = 0;
        JScrollPane panel = new JScrollPane();
        panel.setViewportView(table);

        int result = JOptionPane.showConfirmDialog(_parent, panel, "Choose project", JOptionPane.OK_CANCEL_OPTION,
                JOptionPane.PLAIN_MESSAGE);
        if (result == JOptionPane.OK_OPTION) {
            int selectedRow = table.getSelectedRow();
            if (selectedRow >= 0) {
                // FIXME: hack
                projectID = ((Integer) table.getModel().getValueAt(selectedRow, 0)).intValue();
            }
        }

        return projectID;
    }

    private enum Modes {
        ADD, EDIT
    }
}