/* * (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; import java.awt.BorderLayout; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.File; import java.util.logging.Logger; import javax.swing.JPanel; import javax.swing.JScrollPane; import org.openflexo.fib.FIBLibrary; import org.openflexo.fib.controller.FIBController; import org.openflexo.fib.model.DataBinding; import org.openflexo.fib.model.FIBBrowserAction; import org.openflexo.fib.model.FIBComponent; import org.openflexo.fib.model.listener.FIBMouseClickListener; import org.openflexo.fib.view.FIBView; import org.openflexo.foundation.DataModification; import org.openflexo.foundation.DefaultFlexoEditor; import org.openflexo.foundation.FlexoEditor; import org.openflexo.foundation.FlexoEditor.FlexoEditorFactory; import org.openflexo.foundation.FlexoModelObject; import org.openflexo.foundation.FlexoObservable; import org.openflexo.foundation.GraphicalFlexoObserver; import org.openflexo.foundation.action.FlexoAction; import org.openflexo.foundation.action.FlexoActionType; import org.openflexo.foundation.resource.DefaultResourceCenterService; import org.openflexo.foundation.resource.FlexoResourceCenterService; import org.openflexo.foundation.rm.FlexoProject; import org.openflexo.foundation.rm.FlexoResourceManager; import org.openflexo.foundation.utils.FlexoProgress; import org.openflexo.foundation.utils.ProjectInitializerException; import org.openflexo.foundation.utils.ProjectLoadingCancelledException; import org.openflexo.localization.FlexoLocalization; import org.openflexo.toolbox.HasPropertyChangeSupport; import org.openflexo.toolbox.PropertyChangeListenerRegistrationManager; import org.openflexo.view.controller.FlexoController; import org.openflexo.view.controller.FlexoFIBController; /** * Please comment this class * * @author sguerin * */ public class FlexoFIBView extends JPanel implements GraphicalFlexoObserver, HasPropertyChangeSupport, PropertyChangeListener { static final Logger logger = Logger.getLogger(FlexoFIBView.class.getPackage().getName()); private static final String DELETED = "deleted"; private Object dataObject; public class FIBBrowserActionAdapter extends FIBBrowserAction { private FlexoActionType actionType; public FIBBrowserActionAdapter(FlexoActionType<?, ?, ?> actionType) { super(); this.actionType = actionType; setMethod(new DataBinding("action.performAction(selected)")); setIsAvailable(new DataBinding("action.isAvailable(selected)")); } public Object performAction(Object selected) { if (selected instanceof FlexoModelObject) { FlexoAction action = actionType.makeNewAction((FlexoModelObject) selected, null, controller.getEditor()); action.doAction(); } return null; } public boolean isAvailable(Object selected) { if (selected instanceof FlexoModelObject) { return controller.getEditor().isActionVisible(actionType, (FlexoModelObject) selected, null) && controller.getEditor().isActionEnabled(actionType, (FlexoModelObject) selected, null); } return false; } @Override public String getName() { return actionType.getUnlocalizedName(); } @Override public ActionType getActionType() { if (actionType.getActionCategory() == FlexoActionType.ADD_ACTION_TYPE) { return ActionType.Add; } else if (actionType.getActionCategory() == FlexoActionType.DELETE_ACTION_TYPE) { return ActionType.Delete; } else { return ActionType.Custom; } } } private FlexoController controller; private FIBView fibView; private FlexoFIBController fibController; private FIBComponent fibComponent; private PropertyChangeSupport pcSupport; protected PropertyChangeListenerRegistrationManager manager = new PropertyChangeListenerRegistrationManager(); public FlexoFIBView(Object representedObject, FlexoController controller, File fibFile, FlexoProgress progress) { this(representedObject, controller, fibFile, false, progress); } public FlexoFIBView(Object representedObject, FlexoController controller, File fibFile, boolean addScrollBar, FlexoProgress progress) { this(representedObject, controller, FIBLibrary.instance().retrieveFIBComponent(fibFile), addScrollBar, progress); } public FlexoFIBView(Object representedObject, FlexoController controller, String fibResourcePath, FlexoProgress progress) { this(representedObject, controller, fibResourcePath, false, progress); } public FlexoFIBView(Object representedObject, FlexoController controller, String fibResourcePath, boolean addScrollBar, FlexoProgress progress) { this(representedObject, controller, FIBLibrary.instance().retrieveFIBComponent(fibResourcePath), addScrollBar, progress); } protected FlexoFIBView(Object dataObject, FlexoController controller, FIBComponent fibComponent, boolean addScrollBar, FlexoProgress progress) { super(new BorderLayout()); this.dataObject = dataObject; this.controller = controller; this.fibComponent = fibComponent; if (dataObject instanceof HasPropertyChangeSupport) { manager.addListener(this, (HasPropertyChangeSupport) dataObject); } else if (dataObject instanceof FlexoObservable) { ((FlexoObservable) dataObject).addObserver(this); } pcSupport = new PropertyChangeSupport(this); initializeFIBComponent(); fibController = createFibController(fibComponent, controller); if (progress != null) { progress.setProgress(FlexoLocalization.localizedForKey("build_view")); } fibView = fibController.buildView(fibComponent); if (progress != null) { progress.setProgress(FlexoLocalization.localizedForKey("init_view")); } fibController.setDataObject(dataObject); if (this instanceof FIBMouseClickListener) { fibView.getController().addMouseClickListener((FIBMouseClickListener) this); } if (addScrollBar) { add(new JScrollPane(fibView.getJComponent()), BorderLayout.CENTER); } else { add(fibView.getJComponent(), BorderLayout.CENTER); } validate(); revalidate(); if (progress != null) { progress.hideWindow(); } } /** * Create the Fib Controller to be used for this view. Can be overrided to add functionalities to this Fib View. * * @param fibComponent * @param controller * @return the newly created FlexoFIBController */ protected FlexoFIBController createFibController(FIBComponent fibComponent, FlexoController controller) { FIBController returned = FIBController.instanciateController(fibComponent, FlexoLocalization.getMainLocalizer()); if (returned instanceof FlexoFIBController) { ((FlexoFIBController) returned).setFlexoController(controller); return (FlexoFIBController) returned; } else if (fibComponent.getControllerClass() != null) { logger.warning("Controller for component " + fibComponent + " is not an instanceof FlexoFIBController"); } return fibController = new FlexoFIBController(fibComponent, controller); } public FlexoController getFlexoController() { return controller; } @Override public void update(FlexoObservable observable, DataModification dataModification) { /* * if (dataModification instanceof ObjectDeleted) { if (dataModification.oldValue() == getOntologyObject()) { deleteModuleView(); } * } else if (dataModification.propertyName()!=null && dataModification.propertyName().equals("name")) { * getOEController().getFlexoFrame().updateTitle(); updateTitlePanel(); } */ } @Override public void propertyChange(PropertyChangeEvent evt) { // TODO ! logger.info("propertyChange in FlexoFIBView: " + evt); } public Object getDataObject() { return dataObject; } public void setDataObject(Object object) { if (this.dataObject instanceof HasPropertyChangeSupport) { manager.removeListener(this, (HasPropertyChangeSupport) this.dataObject); } else if (this.dataObject instanceof FlexoObservable) { ((FlexoObservable) this.dataObject).deleteObserver(this); } dataObject = object; if (dataObject instanceof HasPropertyChangeSupport) { manager.addListener(this, (HasPropertyChangeSupport) this.dataObject); } else if (dataObject instanceof FlexoObservable) { ((FlexoObservable) dataObject).addObserver(this); } fibController.setDataObject(object, true); } public FIBComponent getFIBComponent() { return fibComponent; } public FIBView getFIBView() { return fibView; } public FlexoFIBController getFIBController() { return fibController; } public FIBView getFIBView(String componentName) { return fibController.viewForComponent(componentName); } public void deleteView() { if (this instanceof FIBMouseClickListener && fibView.getController() != null) { fibView.getController().removeMouseClickListener((FIBMouseClickListener) this); } fibView.delete(); if (dataObject instanceof FlexoObservable) { ((FlexoObservable) dataObject).deleteObserver(this); } manager.delete(); getPropertyChangeSupport().firePropertyChange(DELETED, false, true); } /** * Returns flag indicating if this view is itself responsible for scroll management When not, Flexo will manage it's own scrollbar for * you * * @return */ public boolean isAutoscrolled() { return false; } /** * This method is a hook which is called just before to initialize FIBView and FIBController, and allow to programmatically define, * check or redefine component */ protected void initializeFIBComponent() { } @Override public PropertyChangeSupport getPropertyChangeSupport() { return pcSupport; } @Override public String getDeletedProperty() { return DELETED; } // test purposes public static FlexoEditor loadProject(File prjDir) { FlexoResourceCenterService resourceCenter = DefaultResourceCenterService.getNewInstance(); FlexoEditor editor = null; try { editor = FlexoResourceManager.initializeExistingProject(prjDir, EDITOR_FACTORY, resourceCenter); } catch (ProjectLoadingCancelledException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ProjectInitializerException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (editor == null) { System.exit(-1); } return editor; } // test purposes protected static final FlexoEditorFactory EDITOR_FACTORY = new FlexoEditorFactory() { @Override public DefaultFlexoEditor makeFlexoEditor(FlexoProject project) { return new FlexoTestEditor(project); } }; // test purposes public static class FlexoTestEditor extends DefaultFlexoEditor { public FlexoTestEditor(FlexoProject project) { super(project); } } }