Package gov.nasa.arc.mct.gui.housing

Source Code of gov.nasa.arc.mct.gui.housing.MCTStandardHousing

/*******************************************************************************
* Mission Control Technologies, Copyright (c) 2009-2012, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* The MCT platform is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
* MCT includes source code licensed under additional open source licenses. See
* the MCT Open Source Licenses file included with this distribution or the About
* MCT Licenses dialog available at runtime from the MCT Help menu for additional
* information.
*******************************************************************************/
/**
* MCTStandardHousing.java Aug 18, 2008
*
* This code is property of the National Aeronautics and Space Administration
* and was produced for the Mission Control Technologies (MCT) Project.
*
*/
package gov.nasa.arc.mct.gui.housing;

import gov.nasa.arc.mct.components.AbstractComponent;
import gov.nasa.arc.mct.context.GlobalContext;
import gov.nasa.arc.mct.defaults.view.MCTHousingViewManifestation;
import gov.nasa.arc.mct.gui.OptionBox;
import gov.nasa.arc.mct.gui.SelectionProvider;
import gov.nasa.arc.mct.gui.TwiddleView;
import gov.nasa.arc.mct.gui.View;
import gov.nasa.arc.mct.gui.ViewProvider;
import gov.nasa.arc.mct.gui.dialogs.ViewModifiedDialog;
import gov.nasa.arc.mct.gui.housing.registry.UserEnvironmentRegistry;
import gov.nasa.arc.mct.gui.impl.WindowManagerImpl;
import gov.nasa.arc.mct.osgi.platform.OSGIRuntime;
import gov.nasa.arc.mct.osgi.platform.OSGIRuntimeImpl;
import gov.nasa.arc.mct.platform.spi.PlatformAccess;
import gov.nasa.arc.mct.services.component.ViewType;
import gov.nasa.arc.mct.util.MCTIcons;

import java.awt.Color;
import java.awt.GraphicsConfiguration;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.ref.WeakReference;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

import org.slf4j.LoggerFactory;

/**
* A panel which contains the standard 3 section housing: a directory area, a
* content area, and an inspector area.
*
* TODO: Move the tree code elsewhere
*
* @author asi
*
*/
@SuppressWarnings("serial")
public class MCTStandardHousing extends MCTAbstractHousing implements TwiddleView {
    private static final ResourceBundle BUNDLE =
            ResourceBundle.getBundle(
                    MCTStandardHousing.class.getName().substring(0,
                            MCTStandardHousing.class.getName().lastIndexOf("."))+".Bundle");
    private static final ResourceBundle SHUTDOWN_BUNDLE =
            ResourceBundle.getBundle("ShutdownResource"); //NO18N

    private final Map<String, MCTHousingViewManifestation> housedManifestations = new HashMap<String, MCTHousingViewManifestation>();

    private int width;
    private int height;

    private MCTHousingViewManifestation housingViewManifestation;
    private final JPanel displayPanel = new JPanel(new GridLayout());
    private SelectionProvider selectionProvider;
    private final List<WeakReference<ControlProvider>> controlAreas = new ArrayList<WeakReference<ControlProvider>>();

    public MCTStandardHousing(int width, int height, int closeAction, View housingView) {
        this(GlobalContext.getGlobalContext().getUser().getUserId() + "'s User Environment", width, height,
                closeAction, housingView);
    }

    public MCTStandardHousing(GraphicsConfiguration gc, String title, int width, int height, int closeAction,
            View housingView) {
        super(gc, housingView.getManifestedComponent().getId());
       
        getContentPane().setLayout(new GridLayout());
        this.width = width;
        this.height = height;
        setSize(this.width, this.height);
        displayPanel.setSize(this.width, this.height);
        setTitle(title);
        setIcon(housingView.getManifestedComponent().getAsset(ImageIcon.class));
        setDefaultCloseOperation(closeAction);
        MCTHousingViewManifestation housingManifestation = (MCTHousingViewManifestation) housingView;
        setHousingViewManifesation(housingManifestation);
        addWindowListenerToHousing();
        getContentPane().add(displayPanel);
    }
   
    public MCTStandardHousing(String title, int width, int height, int closeAction,
            View housingView) {
        super(housingView.getManifestedComponent().getId());

        getContentPane().setLayout(new GridLayout());
        this.width = width;
        this.height = height;
        setSize(this.width, this.height);
        displayPanel.setSize(this.width, this.height);
        setTitle(title);
        setIcon(housingView.getManifestedComponent().getAsset(ImageIcon.class));
        setDefaultCloseOperation(closeAction);
        MCTHousingViewManifestation housingManifestation = (MCTHousingViewManifestation) housingView;
        setHousingViewManifesation(housingManifestation);
        addWindowListenerToHousing();
        getContentPane().add(displayPanel);
    }
   
    private void setIcon(ImageIcon icon) {
        icon = MCTIcons.processIcon(icon, new Color(230,230,230), true);
        if (icon != null) {
            setIconImage(icon.getImage());
        }
    }

    @Override
    public SelectionProvider getSelectionProvider() {
        return selectionProvider;
    }

    public MCTHousingViewManifestation showHousedManifestationIfPresent(String manifestedType) {
        MCTHousingViewManifestation targetViewManifestation = this.housedManifestations.get(manifestedType);
        if (targetViewManifestation != null) {
            showHousedViewManifestation(manifestedType);
        }
        return targetViewManifestation;
    }

    /**
     * Swaps housing view manifestation.
     *
     * @param housingViewManifestation
     */
    public void setHousingViewManifesation(MCTHousingViewManifestation housingViewManifestation) {
        String viewName = housingViewManifestation.getInfo().getViewName();
        housingViewManifestation.setParentHousing(this);
        housingViewManifestation.setVisible(true);
        housedManifestations.put(viewName, housingViewManifestation);
        showHousedViewManifestation(viewName);
        selectionProvider = housingViewManifestation.getSelectionProvider();
        if (selectionProvider == null) {
            throw new IllegalArgumentException("housing view role " + housingViewManifestation.getClass().getName()
                    + " must not return null from getSelectionProvider");
        }
    }

    private void showHousedViewManifestation(String manifestedType) {
        MCTHousingViewManifestation displayedViewManifestation = housedManifestations.get(manifestedType);
        displayPanel.removeAll();
        this.housingViewManifestation = displayedViewManifestation;
        displayPanel.add(this.housingViewManifestation);
        displayPanel.revalidate();
    }

    private void addWindowListenerToHousing() {
        this.addWindowListener(new WindowAdapter() {

            public void windowClosing(WindowEvent e) {
                    if (UserEnvironmentRegistry.getHousingCount() == 1) {
                        // Pop up a confirmation dialog if this is the last window
                        Object[] options = { SHUTDOWN_BUNDLE.getString("OK"), SHUTDOWN_BUNDLE.getString("CANCEL") }; //NO18N 

                        Map<String, Object> hints = new HashMap<String, Object>();
                        hints.put(WindowManagerImpl.MESSAGE_TYPE, OptionBox.WARNING_MESSAGE);
                        hints.put(WindowManagerImpl.OPTION_TYPE, OptionBox.YES_NO_OPTION);
                        hints.put(WindowManagerImpl.PARENT_COMPONENT, (MCTAbstractHousing) UserEnvironmentRegistry.getActiveHousing());
                        Object response = PlatformAccess.getPlatform().getWindowManager().showInputDialog(
                                SHUTDOWN_BUNDLE.getString("TITLE"),   //NOI18N
                                SHUTDOWN_BUNDLE.getString("MESSAGE"), //NOI18N
                                options,
                                options[0],
                                hints);
                       
                        if (response != null && response.equals(options[0])) { // "OK"
                            OSGIRuntime osgiRuntime = OSGIRuntimeImpl.getOSGIRuntime();
                            try {
                                osgiRuntime.stopOSGI();
                            } catch (Exception e1) {
                                LoggerFactory.getLogger(MCTStandardHousing.class).warn(e1.getMessage(), e1);
                            }
                            disposeHousing();
                        }
                       
                    } else {                       
                        closeHousing();
                    }
                }
           


        });

    }
      

    public void buildGUI() {
        this.housingViewManifestation.buildGUI();
    }

    public void setControlArea(MCTControlArea controlArea) {
        this.housingViewManifestation.setControlArea(controlArea);
    }

    public void setControlAreaVisible(boolean flag) {
        if (this.housingViewManifestation != null)
            this.housingViewManifestation.setControlAreaVisible(flag);
    }

    public boolean isControlAreaVisible() {
        boolean visible = this.housingViewManifestation.isControlAreaVisible();
        for (WeakReference<ControlProvider> controlArea : controlAreas) {
            ControlProvider cp = controlArea.get();
            if (cp != null) {
                visible |= cp.isControlShowing();
            }
        }
        return visible;
    }

    public void setDirectoryArea(View directoryArea) {
        if (directoryArea instanceof ControlProvider) {
            addControlArea((ControlProvider)directoryArea);
        }
        this.housingViewManifestation.setDirectoryArea(directoryArea);
    }

    public void setContentArea(MCTContentArea contentArea) {
        addControlArea(contentArea);
        this.housingViewManifestation.setContentArea(contentArea);
    }

    public void setInspectionArea(View inspectionArea) {
        if (inspectionArea instanceof ControlProvider) {
            addControlArea((ControlProvider)inspectionArea);
        }
        this.housingViewManifestation.setInspectionArea(inspectionArea);
    }

    @Override
    public View getInspectionArea() {
        return this.housingViewManifestation.getInspectionArea();
    }

    @Override
    public View getDirectoryArea() {
        return this.housingViewManifestation.getDirectoryArea();
    }

    @Override
    public MCTContentArea getContentArea() {
        return this.housingViewManifestation.getContentArea();
    }

    @Override
    public MCTControlArea getControlArea() {
        return this.housingViewManifestation.getControlArea();
    }

    @Override
    public View getCurrentManifestation() {
        return this.housingViewManifestation.getCurrentManifestation();
    }

    public AbstractComponent getWindowComponent() {
        return this.housingViewManifestation.getManifestedComponent();
    }

    @Override
    public View getHousedViewManifestation() {
        return housingViewManifestation;
    }
   
    @Override
    public Collection<ViewProvider> getHousedManifestationProviders() {
        List<ViewProvider> housedProviders = new ArrayList<ViewProvider>();
       
        if (getDirectoryArea() != null) {
            housedProviders.add(getDirectoryArea());
        }
       
        if (getContentArea() != null) {
            housedProviders.add(getContentArea());
        }
        return housedProviders;
    }

    @Override
    public void setStatusArea(MCTStatusArea statusArea) {
        this.housingViewManifestation.setStatusArea(statusArea);
    }

    @Override
    public MCTStatusArea getStatusArea() {
        return this.housingViewManifestation.getStatusArea();
    }
   
    @Override
    public void toggleControlAreas(boolean showing) {
        Iterator<WeakReference<ControlProvider>> it = controlAreas.iterator();
        while (it.hasNext()) {
            ControlProvider cp = it.next().get();
            if (cp == null) {
                it.remove();
            } else {
                cp.showControl(showing);
            }
        }
    }
   
    @Override
    public void addControlArea(ControlProvider provider) {
        controlAreas.add(new WeakReference<ControlProvider>(provider));
    }

    private void disposeHousing() {
        UserEnvironmentRegistry.removeHousing(this);
        dispose();
    }

    @Override
    public void enterTwiddleMode(AbstractComponent twiddledComponent) {
        MCTHousingFactory.refreshHousing(this,twiddledComponent.getViewInfos(ViewType.LAYOUT).iterator().next().createView(twiddledComponent));
    }

    @Override
    public void exitTwiddleMode(AbstractComponent originalComponent) {
        MCTHousingFactory.refreshHousing(this, originalComponent.getViewInfos(ViewType.LAYOUT).iterator().next().createView(originalComponent));
    }
   
    @Override
    public void closeHousing() {
        boolean toCloseWindow = true;
        MCTContentArea centerPane = housingViewManifestation.getContentArea();
        if (centerPane != null) {
            View centerPaneView = centerPane.getHousedViewManifestation();
            AbstractComponent centerComponent = centerPaneView.getManifestedComponent();
            if (!centerComponent.isStale() && centerComponent.isDirty()) {
                toCloseWindow = commitOrAbortPendingChanges(centerPaneView,
                        MessageFormat.format(BUNDLE.getString("centerpane.modified.alert.text"),
                                centerPaneView.getInfo().getViewName(),
                                centerComponent.getDisplayName()));
            }
        }
        View inspectionArea = housingViewManifestation.getInspectionArea();
        if (inspectionArea != null) {
            View inspectorPaneView = inspectionArea.getHousedViewManifestation();
            AbstractComponent inspectorComponent = inspectorPaneView.getManifestedComponent();
            if (!inspectorComponent.isStale() && inspectorComponent.isDirty()) {
                toCloseWindow = commitOrAbortPendingChanges(inspectionArea,
                            MessageFormat.format(BUNDLE.getString("inspectorpane.modified.alert.text"),
                                inspectorPaneView.getInfo().getViewName(),
                                inspectorComponent.getDisplayName()));
            }
        }
        if (toCloseWindow) {
            disposeHousing();
        }
    }
   
    /**
     * Prompts users to commit or abort pending changes in view.
     * @param view the modified view
     * @param dialogMessage the dialog message which differs from where the view is located (in the center or inspector pane)
     * @return false to keep the window open, true to close the window
     */
    private boolean commitOrAbortPendingChanges(View view, String dialogMessage) {
        return new ViewModifiedDialog(view).commitOrAbortPendingChanges(dialogMessage);
    }

}
TOP

Related Classes of gov.nasa.arc.mct.gui.housing.MCTStandardHousing

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.