/*
* (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.inspector;
import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openflexo.fib.controller.FIBController;
import org.openflexo.fib.model.FIBComponent;
import org.openflexo.fib.view.FIBView;
import org.openflexo.fib.view.container.FIBTabPanelView;
import org.openflexo.inspector.ModuleInspectorController.EmptySelectionActivated;
import org.openflexo.inspector.ModuleInspectorController.InspectedObjectChanged;
import org.openflexo.inspector.ModuleInspectorController.InspectorSwitching;
import org.openflexo.inspector.ModuleInspectorController.MultipleSelectionActivated;
import org.openflexo.inspector.ModuleInspectorController.NewInspectorsLoaded;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.view.controller.FlexoFIBController;
/**
* Represent a JDialog showing inspector for the selection managed by an instance of ModuleInspectorController
*
* @author sylvain
*
*/
public class FIBInspectorPanel extends JPanel implements Observer, ChangeListener {
static final Logger logger = Logger.getLogger(FIBInspectorPanel.class.getPackage().getName());
private final JPanel EMPTY_CONTENT;
private final JPanel MULTIPLE_SELECTION_CONTENT;
private final Map<FIBInspector, FIBView<?, ?>> inspectorViews;
private final ModuleInspectorController inspectorController;
private int lastInspectedTabIndex = -1;
private FIBTabPanelView tabPanelView;
public FIBInspectorPanel(ModuleInspectorController inspectorController) {
super(new BorderLayout());
this.inspectorController = inspectorController;
inspectorController.addObserver(this);
inspectorViews = new Hashtable<FIBInspector, FIBView<?, ?>>();
resetViews();
EMPTY_CONTENT = new JPanel(new BorderLayout());
EMPTY_CONTENT.add(new JLabel("No selection", SwingConstants.CENTER), BorderLayout.CENTER);
MULTIPLE_SELECTION_CONTENT = new JPanel(new BorderLayout());
MULTIPLE_SELECTION_CONTENT.add(new JLabel("Multiple selection", SwingConstants.CENTER), BorderLayout.CENTER);
switchToEmptyContent();
}
private void resetViews() {
if (inspectorViews != null) {
for (FIBView<?, ?> v : inspectorViews.values()) {
FlexoLocalization.removeFromLocalizationListeners(v);
}
inspectorViews.clear();
}
/*for (Class<?> c : inspectorController.getInspectors().keySet()) {
FIBInspector inspector = inspectorController.getInspectors().get(c);
FIBView<?, ?> inspectorView = FIBController.makeView(inspector, FlexoLocalization.getMainLocalizer());
FlexoLocalization.addToLocalizationListeners(inspectorView);
inspectorViews.put(inspector, inspectorView);
if (logger.isLoggable(Level.FINE)) {
logger.fine("Initialized view for inspector for " + inspector.getDataClass());
}
}*/
}
private FIBView<?, ?> buildViewFor(FIBInspector inspector) {
FIBView<?, ?> inspectorView = FIBController.makeView(inspector, FlexoLocalization.getMainLocalizer());
FIBController controller = inspectorView.getController();
if (controller instanceof FlexoFIBController) {
((FlexoFIBController) controller).setFlexoController(inspectorController.getFlexoController());
}
FlexoLocalization.addToLocalizationListeners(inspectorView);
inspectorViews.put(inspector, inspectorView);
if (logger.isLoggable(Level.INFO)) {
logger.info("Initialized view for inspector for " + inspector.getDataClass());
}
return inspectorView;
}
public void delete() {
inspectorController.deleteObserver(this);
for (FIBView<?, ?> v : inspectorViews.values()) {
v.getController().delete();
FlexoLocalization.removeFromLocalizationListeners(v);
}
if (tabPanelView != null) {
tabPanelView.getController().delete();
}
inspectorViews.clear();
tabPanelView = null;
}
private FIBView<?, ?> currentInspectorView = null;
/**
* Returns boolean indicating if inspection change
*
* @param object
* @return
*/
/*private boolean inspectObject(Object object, FIBInspector inspector, boolean updateEPTabs) {
FIBInspector newInspector =
if (object == currentInspectedObject) {
return false;
}
currentInspectedObject = object;
FIBInspector newInspector = inspectorController.inspectorForObject(object);
if (newInspector == null) {
logger.warning("No inspector for " + object);
switchToEmptyContent();
} else {
if (newInspector != currentInspector) {
switchToInspector(newInspector);
}
if (object instanceof FlexoModelObject) {
updateEditionPatternReferences(newInspector, (FlexoModelObject) object);
}
currentInspectorView.getController().setDataObject(object);
}
return true;
}*/
/*private void updateEditionPatternReferences(FIBInspector inspector, FlexoModelObject object) {
if (inspector.updateEditionPatternReferences(object)) {
FIBView<?, ?> view = viewForInspector(inspector);
FIBController controller = view.getController();
FIBTabPanelView tabPanelView = (FIBTabPanelView) controller.viewForComponent(inspector.getTabPanel());
tabPanelView.updateLayout();
} else {
// Nothing change: nice !!!
}
}*/
private void switchToEmptyContent() {
currentInspectorView = null;
removeAll();
add(EMPTY_CONTENT, BorderLayout.CENTER);
revalidate();
repaint();
}
private void switchToMultipleSelection() {
currentInspectorView = null;
removeAll();
add(MULTIPLE_SELECTION_CONTENT, BorderLayout.CENTER);
revalidate();
repaint();
}
private void switchToInspector(FIBInspector newInspector, boolean updateEPTabs) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("switchToInspector " + newInspector + " for " + this);
}
if (updateEPTabs) {
FIBView<?, ?> view = viewForInspector(newInspector);
FIBController controller = view.getController();
FIBTabPanelView tabPanelView = (FIBTabPanelView) controller.viewForComponent(newInspector.getTabPanel());
tabPanelView.updateLayout();
}
if (tabPanelView != null) {
tabPanelView.getJComponent().removeChangeListener(this);
// System.out.println("removeChangeListener for "+tabPanelView.getJComponent());
}
// System.out.println("switchToInspector() "+newInspector);
FIBView<?, ?> view = viewForInspector(newInspector);
if (view != null) {
currentInspectorView = view;
removeAll();
add(currentInspectorView.getResultingJComponent(), BorderLayout.CENTER);
revalidate();
repaint();
// logger.info("reset title to "+newInspector.getParameter("title"));dsqqsd
// inspectorDialog.setTitle(newInspector.getParameter("title"));
tabPanelView = (FIBTabPanelView) currentInspectorView.getController().viewForComponent(newInspector.getTabPanel());
if (lastInspectedTabIndex >= 0 && lastInspectedTabIndex < tabPanelView.getJComponent().getTabCount()) {
tabPanelView.getJComponent().setSelectedIndex(lastInspectedTabIndex);
}
tabPanelView.getJComponent().addChangeListener(this);
// System.out.println("addChangeListener for "+tabPanelView.getJComponent());
} else {
logger.warning("No inspector view for " + newInspector);
switchToEmptyContent();
}
}
private void switchToObject(Object inspectedObject) {
if (logger.isLoggable(Level.FINE)) {
logger.fine("switchToObject " + inspectedObject + " for " + this);
}
currentInspectorView.getController().setDataObject(inspectedObject);
}
private FIBView<?, ?> viewForInspector(FIBInspector inspector) {
FIBView<?, ?> returned = inspectorViews.get(inspector);
if (returned == null) {
returned = buildViewFor(inspector);
}
return returned;
}
@Override
public void update(Observable o, Object notification) {
// logger.info("FIBInspectorController received: "+selection);
if (notification instanceof NewInspectorsLoaded) {
resetViews();
}
if (notification instanceof EmptySelectionActivated) {
switchToEmptyContent();
} else if (notification instanceof MultipleSelectionActivated) {
switchToMultipleSelection();
} else if (notification instanceof InspectorSwitching) {
switchToInspector(((InspectorSwitching) notification).getNewInspector(), ((InspectorSwitching) notification).updateEPTabs());
} else if (notification instanceof InspectedObjectChanged) {
switchToObject(((InspectedObjectChanged) notification).getInspectedObject());
}
}
@Override
public void stateChanged(ChangeEvent e) {
lastInspectedTabIndex = tabPanelView.getJComponent().getSelectedIndex();
// System.out.println("Change for index "+lastInspectedTabIndex);
}
public void refreshComponentVisibility() {
if (currentInspectorView != null) {
currentInspectorView.update(new ArrayList<FIBComponent>());
}
}
}