org.openflexo.view.controller.FlexoInspectorController.java Source code

Java tutorial

Introduction

Here is the source code for org.openflexo.view.controller.FlexoInspectorController.java

Source

/*
 * (c) Copyright 2010-2011 AgileBirds
 *
 * This file is part of OpenFlexo.
 *
 * OpenFlexo 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 3 of the License, or
 * (at your option) any later version.
 *
 * OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
 *
 */
package org.openflexo.view.controller;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

import org.apache.commons.io.IOUtils;
import org.openflexo.GeneralPreferences;
import org.openflexo.ch.DefaultInspectorHelpDelegate;
import org.openflexo.components.ProgressWindow;
import org.openflexo.drm.DocItem;
import org.openflexo.drm.DocResourceManager;
import org.openflexo.drm.Language;
import org.openflexo.foundation.InspectorGroup;
import org.openflexo.foundation.Inspectors;
import org.openflexo.foundation.rm.FlexoProject;
import org.openflexo.inspector.HelpDelegate;
import org.openflexo.inspector.InspectorController;
import org.openflexo.inspector.InspectorDelegate;
import org.openflexo.inspector.InspectorWidgetConfiguration;
import org.openflexo.inspector.model.InspectorModel;
import org.openflexo.inspector.model.ParamModel;
import org.openflexo.inspector.model.ParametersContainerModelObject;
import org.openflexo.inspector.model.PropertyListAction;
import org.openflexo.inspector.model.PropertyListColumn;
import org.openflexo.inspector.model.PropertyListModel;
import org.openflexo.inspector.model.PropertyModel;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.module.UserType;

public abstract class FlexoInspectorController extends InspectorController {

    private static final Logger logger = Logger.getLogger(FlexoInspectorController.class.getPackage().getName());
    private static final InspectorWidgetConfiguration DEFAULT_CONFIGURATION = new InspectorWidgetConfiguration() {

        @Override
        public boolean showViewSourceButtonInWysiwyg() {
            return UserType.isDevelopperRelease() || UserType.isMaintainerRelease();
        }

    };

    protected FlexoInspectorController(FlexoController controller) {
        this(controller.new FlexoControllerInspectorDelegate(),
                new DefaultInspectorHelpDelegate(DocResourceManager.instance()));
    }

    protected FlexoInspectorController(InspectorDelegate inspectorDelegate, HelpDelegate helpDelegate) {
        super(inspectorDelegate, helpDelegate, DEFAULT_CONFIGURATION);
    }

    protected void loadAllCustomInspectors(FlexoProject project) {
        if (project != null) {
            File customInspectorDirectory = project.getCustomInspectorsDirectory();

            // Load custom inspectors
            if (customInspectorDirectory != null) {
                // Load custom inspectors
                ProgressWindow.setProgressInstance(FlexoLocalization.localizedForKey("load_custom_inspectors"));
                loadInspectors(customInspectorDirectory);
            }

            updateSuperInspectors();
        }
    }

    private void loadInspectors(File directory) {
        File[] files = directory.listFiles();

        int steps = files.length;
        ProgressWindow.resetSecondaryProgressInstance(steps);

        for (int i = 0; i < files.length; i++) {
            if (files[i].getName().endsWith(".inspector")) {
                if (logger.isLoggable(Level.FINE)) {
                    logger.fine("Loading " + files[i].getName() + "...");
                }
                ProgressWindow.setSecondaryProgressInstance(
                        FlexoLocalization.localizedForKey("loading") + " " + files[i].getName() + "...");
                // String inspectorName =
                // files[i].getName().substring(files[i].getName().lastIndexOf(".inspector"));
                try {
                    importInspectorFile(files[i]);
                } catch (FileNotFoundException e) {
                    logger.warning("File NOT FOUND: " + files[i]);
                }
            }
        }
        updateSuperInspectors();

    }

    protected void loadInspectors(InspectorGroup inspectorGroup) {
        if (inspectorGroup != null) {

            for (InspectorGroup currentInspectorGroup : new InspectorGroup[] { Inspectors.COMMON,
                    inspectorGroup }) {

                List<String> inspectorsToLoad = currentInspectorGroup.getAllInspectorNames();
                Hashtable<String, InspectorModel> loadedInspectors = new Hashtable<String, InspectorModel>();

                int steps = inspectorsToLoad.size();
                ProgressWindow.resetSecondaryProgressInstance(steps);

                for (String inspectorName : inspectorsToLoad) {
                    if (inspectorName.endsWith(".inspector")) {
                        if (logger.isLoggable(Level.INFO)) {
                            logger.info("Loading " + inspectorName + "...");
                        }
                        ProgressWindow.setSecondaryProgressInstance(
                                FlexoLocalization.localizedForKey("loading") + " " + inspectorName + "...");
                        String cleanedInspectorName = inspectorName.substring(0,
                                inspectorName.length() - ".inspector".length());
                        if (loadedInspectors.get(cleanedInspectorName) == null) {
                            InputStream inputStream = currentInspectorGroup.getInspectorStream(inspectorName);
                            if (inputStream != null) {
                                try {
                                    loadedInspectors.put(cleanedInspectorName,
                                            importInspector(inspectorName, inputStream));
                                } finally {
                                    IOUtils.closeQuietly(inputStream);
                                }
                            }
                        }
                    }
                }
                updateSuperInspectors();

                for (Enumeration<String> en = loadedInspectors.keys(); en.hasMoreElements();) {
                    String inspectorName = en.nextElement();
                    InspectorModel inspectorModel = loadedInspectors.get(inspectorName);
                    inspectorModel.inspectorName = inspectorName;
                    DocResourceManager.instance().importInspector(currentInspectorGroup, inspectorName,
                            inspectorModel);
                    cleanInspectorModel(inspectorModel);
                }
            }
        }
    }

    /**
     * @param inspectorModel
     */
    public static void cleanInspectorModel(InspectorModel inspectorModel) {
        if (logger.isLoggable(Level.FINE)) {
            logger.fine("cleanInspectorModel " + inspectorModel.inspectorName);
        }
        Language language = DocResourceManager.instance().getLanguage(GeneralPreferences.getLanguage());
        for (Enumeration<PropertyModel> en2 = inspectorModel.getAllPropertyModel().elements(); en2
                .hasMoreElements();) {
            PropertyModel propertyModel = en2.nextElement();
            Enumeration<String> en = new Hashtable<String, ParamModel>(propertyModel.parameters).keys();
            while (en.hasMoreElements()) {
                ParamModel p = propertyModel.parameters.get(en.nextElement());
                if (p == null) {
                    continue;
                }
                cleanParameters(propertyModel.parameters, p);
            }
            if (propertyModel instanceof PropertyListModel) {
                PropertyListModel plm = (PropertyListModel) propertyModel;
                Iterator<PropertyListAction> i = plm.getActions().iterator();
                while (i.hasNext()) {
                    PropertyListAction pla = i.next();
                    Enumeration<String> en1 = new Hashtable<String, ParamModel>(pla.parameters).keys();
                    while (en1.hasMoreElements()) {
                        ParamModel p1 = pla.parameters.get(en1.nextElement());
                        if (p1 == null) {
                            continue;
                        }
                        cleanParameters(pla.parameters, p1);
                    }
                    if (parametersContainerIsDisplayable(pla, UserType.getCurrentUserType())) {
                        // Let's keep it
                    } else {
                        i.remove();
                    }
                }
                Iterator<PropertyListColumn> j = plm.getColumns().iterator();
                while (j.hasNext()) {
                    PropertyListColumn plc = j.next();
                    Enumeration<String> en1 = new Hashtable<String, ParamModel>(plc.parameters).keys();
                    while (en1.hasMoreElements()) {
                        ParamModel p1 = plc.parameters.get(en1.nextElement());
                        if (p1 == null) {
                            continue;
                        }
                        cleanParameters(plc.parameters, p1);
                    }
                    if (parametersContainerIsDisplayable(plc, UserType.getCurrentUserType())) {
                        // Let's keep it
                    } else {
                        j.remove();
                    }
                }
            }
            if (parametersContainerIsDisplayable(propertyModel, UserType.getCurrentUserType())) {
                DocItem propertyModelItem = DocResourceManager.instance().getDocItemFor(propertyModel);
                if (propertyModelItem != null) {
                    if (propertyModelItem.getLastApprovedActionForLanguage(language) != null) {
                        propertyModel.help = "<html>" + propertyModelItem.getLastApprovedActionForLanguage(language)
                                .getVersion().getShortHTMLDescription() + "</html>";
                        logger.fine("Set text for" + propertyModel.name + " to be " + propertyModel.help);
                    }
                }
            } else {
                // This property should not be displayed
                logger.fine("Remove property " + propertyModel.name);
                propertyModel.getTabModel().removePropertyWithKey(propertyModel.name);
            }
        }
    }

    /**
     * @param parameters
     */
    private static void cleanParameters(Hashtable<String, ParamModel> parameters, ParamModel paramModel) {
        Hashtable<String, ParamModel> clone = new Hashtable<String, ParamModel>(paramModel.parameters);
        Enumeration<String> en = clone.keys();
        while (en.hasMoreElements()) {
            ParamModel p = paramModel.parameters.get(en.nextElement());
            if (p == null) {
                continue;
            }
            if (p.parameters.size() > 0) {
                cleanParameters(paramModel.parameters, p);
            }
            if (parametersContainerIsDisplayable(paramModel, UserType.getCurrentUserType())) {
                // Let's keep it
            } else {
                parameters.remove(paramModel.name);
            }
        }
    }

    private static boolean parametersContainerIsDisplayable(ParametersContainerModelObject paramContainer,
            UserType userType) {
        if (paramContainer.hasValueForParameter("visibleFor")) {
            if (!evaluateVisibleCondition(paramContainer, userType)) {
                return false;
            }
        }
        if (paramContainer.hasValueForParameter("hiddenFor")) {
            if (!evaluateHiddenCondition(paramContainer, userType)) {
                return false;
            }
        }
        return true;
    }

    private static boolean evaluateVisibleCondition(ParametersContainerModelObject paramContainer,
            UserType userType) {
        String condition = paramContainer.getValueForParameter("visibleFor");
        StringTokenizer st = new StringTokenizer(condition, ",");
        String token;
        while (st.hasMoreTokens()) {
            token = st.nextToken();
            if (token.equalsIgnoreCase("ALL")) {
                return true;
            }
            UserType nextUT = UserType.getUserTypeNamed(token);
            if ((nextUT != null) && (nextUT.equals(userType))) {
                return true;
            }
        }
        return false;
    }

    private static boolean evaluateHiddenCondition(ParametersContainerModelObject paramContainer,
            UserType userType) {
        String condition = paramContainer.getValueForParameter("hiddenFor");
        StringTokenizer st = new StringTokenizer(condition, ",");
        String token;
        while (st.hasMoreTokens()) {
            token = st.nextToken();
            if (token.equalsIgnoreCase("ALL")) {
                return false;
            }
            UserType nextUT = UserType.getUserTypeNamed(token);
            if ((nextUT != null) && (nextUT.equals(userType))) {
                return false;
            }
        }
        return true;
    }

    /*private File _inspectorDirectory;
        
    protected File getInspectorDirectory()
    {
       if (_inspectorDirectory == null) {
     _inspectorDirectory = new FileResource("FlexoWorkflowEditor/src/main/resources/Config/Inspector");
     if (!_inspectorDirectory.exists()) {
        logger.warning("Inspector directory NOT FOUND ! (searched "+_inspectorDirectory+")");
     }
     else System.out.println("Found "+_inspectorDirectory);
       }
       return _inspectorDirectory;
    }*/

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        final JDialog dialog = new JDialog(frame);
        dialog.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
        JButton button = new JButton("Show dialog");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                dialog.setVisible(true);
            }
        });
        JLabel label = new JLabel("coucou");
        dialog.add(label);
        dialog.pack();
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(button);
        panel.setPreferredSize(new Dimension(500, 400));
        frame.add(panel);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

}