/*
* (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.fib.controller;
import java.awt.Component;
import java.awt.Window;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.SwingUtilities;
import org.openflexo.antar.binding.AbstractBinding.BindingEvaluationContext;
import org.openflexo.antar.binding.BindingVariable;
import org.openflexo.fib.FIBLibrary;
import org.openflexo.fib.model.FIBBrowser;
import org.openflexo.fib.model.FIBButton;
import org.openflexo.fib.model.FIBCheckBox;
import org.openflexo.fib.model.FIBCheckboxList;
import org.openflexo.fib.model.FIBColor;
import org.openflexo.fib.model.FIBComponent;
import org.openflexo.fib.model.FIBContainer;
import org.openflexo.fib.model.FIBCustom;
import org.openflexo.fib.model.FIBDropDown;
import org.openflexo.fib.model.FIBEditorPane;
import org.openflexo.fib.model.FIBFile;
import org.openflexo.fib.model.FIBFont;
import org.openflexo.fib.model.FIBHtmlEditor;
import org.openflexo.fib.model.FIBImage;
import org.openflexo.fib.model.FIBLabel;
import org.openflexo.fib.model.FIBList;
import org.openflexo.fib.model.FIBLocalizedDictionary;
import org.openflexo.fib.model.FIBNumber;
import org.openflexo.fib.model.FIBPanel;
import org.openflexo.fib.model.FIBRadioButtonList;
import org.openflexo.fib.model.FIBSplitPanel;
import org.openflexo.fib.model.FIBTab;
import org.openflexo.fib.model.FIBTabPanel;
import org.openflexo.fib.model.FIBTable;
import org.openflexo.fib.model.FIBTextArea;
import org.openflexo.fib.model.FIBTextField;
import org.openflexo.fib.model.FIBTextPane;
import org.openflexo.fib.model.FIBWidget;
import org.openflexo.fib.model.listener.FIBMouseClickListener;
import org.openflexo.fib.model.listener.FIBSelectionListener;
import org.openflexo.fib.view.FIBContainerView;
import org.openflexo.fib.view.FIBView;
import org.openflexo.fib.view.FIBWidgetView;
import org.openflexo.fib.view.container.FIBPanelView;
import org.openflexo.fib.view.container.FIBSplitPanelView;
import org.openflexo.fib.view.container.FIBTabPanelView;
import org.openflexo.fib.view.container.FIBTabView;
import org.openflexo.fib.view.widget.FIBBrowserWidget;
import org.openflexo.fib.view.widget.FIBButtonWidget;
import org.openflexo.fib.view.widget.FIBCheckBoxWidget;
import org.openflexo.fib.view.widget.FIBCheckboxListWidget;
import org.openflexo.fib.view.widget.FIBColorWidget;
import org.openflexo.fib.view.widget.FIBCustomWidget;
import org.openflexo.fib.view.widget.FIBDropDownWidget;
import org.openflexo.fib.view.widget.FIBEditorPaneWidget;
import org.openflexo.fib.view.widget.FIBFileWidget;
import org.openflexo.fib.view.widget.FIBFontWidget;
import org.openflexo.fib.view.widget.FIBHtmlEditorWidget;
import org.openflexo.fib.view.widget.FIBImageWidget;
import org.openflexo.fib.view.widget.FIBLabelWidget;
import org.openflexo.fib.view.widget.FIBListWidget;
import org.openflexo.fib.view.widget.FIBNumberWidget;
import org.openflexo.fib.view.widget.FIBRadioButtonListWidget;
import org.openflexo.fib.view.widget.FIBTableWidget;
import org.openflexo.fib.view.widget.FIBTextAreaWidget;
import org.openflexo.fib.view.widget.FIBTextFieldWidget;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.localization.Language;
import org.openflexo.localization.LocalizedDelegate;
import org.openflexo.toolbox.StringUtils;
import org.openflexo.toolbox.ToolBox;
/**
* Represent the controller of an instantiation of a FIBComponent in a particular Window Toolkit context (eg Swing)
*
* @author sylvain
*
* @param <T>
*/
public class FIBController extends Observable implements BindingEvaluationContext, Observer {
private static final Logger logger = Logger.getLogger(FIBController.class.getPackage().getName());
private Object dataObject;
private final FIBComponent rootComponent;
private final Hashtable<FIBComponent, FIBView<?, ?>> views;
private FIBSelectable selectionLeader;
private FIBSelectable lastFocusedSelectable;
private FIBWidgetView<?, ?, ?> focusedWidget;
private LocalizedDelegate parentLocalizer = null;
private FIBViewFactory viewFactory;
public enum Status {
RUNNING, VALIDATED, CANCELED, ABORTED, RESET, YES, NO, QUIT, OTHER
}
private Status status = Status.RUNNING;
private final Vector<FIBSelectionListener> selectionListeners;
private final Vector<FIBMouseClickListener> mouseClickListeners;
private MouseEvent mouseEvent;
private boolean deleted = false;
public FIBController(FIBComponent rootComponent) {
this.rootComponent = rootComponent;
views = new Hashtable<FIBComponent, FIBView<?, ?>>();
selectionListeners = new Vector<FIBSelectionListener>();
mouseClickListeners = new Vector<FIBMouseClickListener>();
viewFactory = new DefaultFIBViewFactory();
}
public void delete() {
if (!deleted) {
getRootView().delete();
// Next for-block should not be necessary because deletion is recursive, but just to be sure
for (FIBView<?, ?> view : new ArrayList<FIBView<?, ?>>(views.values())) {
view.delete();
}
if (dataObject instanceof Observable) {
((Observable) dataObject).deleteObserver(this);
}
dataObject = null;
deleted = true;
}
}
public boolean isDeleted() {
return deleted;
}
public FIBView<FIBComponent, ?> buildView() {
return buildView(rootComponent);
}
public FIBViewFactory getViewFactory() {
return viewFactory;
}
public void setViewFactory(FIBViewFactory viewFactory) {
this.viewFactory = viewFactory;
}
public void registerView(FIBView<?, ?> view) {
views.put(view.getComponent(), view);
}
public void unregisterView(FIBView<?, ?> view) {
views.remove(view.getComponent());
}
public FIBView<?, ?> viewForComponent(FIBComponent component) {
return views.get(component);
}
public FIBView<?, ?> viewForComponent(String componentName) {
FIBComponent c = getRootComponent().getComponentNamed(componentName);
if (c != null) {
return views.get(c);
}
return null;
}
public Enumeration<FIBView<?, ?>> getViews() {
return views.elements();
}
@Override
public Object getValue(BindingVariable variable) {
if (variable.getVariableName() == null) {
return null;
}
if (variable.getVariableName().equals("data")) {
return dataObject;
}
for (FIBComponent c : views.keySet()) {
if (variable.getVariableName().equals(c.getName())) {
return viewForComponent(c).getDynamicModel();
}
}
if (variable.getVariableName().equals("controller")) {
return this;
}
return variable.getBindingValue(null, this);
}
public FIBComponent getRootComponent() {
return rootComponent;
}
public FIBView getRootView() {
return viewForComponent(getRootComponent());
}
public Object getDataObject() {
return dataObject;
}
public void setDataObject(Object anObject) {
setDataObject(anObject, false);
}
public void updateWithoutDataObject() {
setDataObject(null, true);
}
public void setDataObject(Object anObject, boolean forceUpdate) {
if (forceUpdate || anObject != dataObject) {
if (dataObject instanceof Observable) {
((Observable) dataObject).deleteObserver(this);
}
dataObject = anObject;
getRootView().updateDataObject(anObject);
if (dataObject instanceof Observable) {
((Observable) dataObject).addObserver(this);
}
}
}
public static FIBController instanciateController(FIBComponent fibComponent, LocalizedDelegate parentLocalizer) {
FIBController returned = null;
if (fibComponent.getControllerClass() != null) {
try {
Constructor<? extends FIBController> c = fibComponent.getControllerClass().getConstructor(FIBComponent.class);
returned = c.newInstance(fibComponent);
} catch (SecurityException e) {
logger.warning("SecurityException: Could not instanciate " + fibComponent.getControllerClass());
} catch (NoSuchMethodException e) {
logger.warning("NoSuchMethodException: Could not instanciate " + fibComponent.getControllerClass());
} catch (IllegalArgumentException e) {
logger.warning("IllegalArgumentException: Could not instanciate " + fibComponent.getControllerClass());
} catch (InstantiationException e) {
logger.warning("InstantiationException: Could not instanciate " + fibComponent.getControllerClass());
} catch (IllegalAccessException e) {
logger.warning("IllegalAccessException: Could not instanciate " + fibComponent.getControllerClass());
} catch (InvocationTargetException e) {
logger.warning("InvocationTargetException: Could not instanciate " + fibComponent.getControllerClass());
}
}
if (returned == null) {
returned = new FIBController(fibComponent);
}
returned.setParentLocalizer(parentLocalizer);
return returned;
}
public static FIBView makeView(FIBComponent fibComponent, LocalizedDelegate parentLocalizer) {
return makeView(fibComponent, instanciateController(fibComponent, parentLocalizer));
}
public static FIBView makeView(FIBComponent fibComponent, FIBController controller) {
return controller.buildView(fibComponent);
}
protected static void recursivelyAddEditorLauncher(EditorLauncher editorLauncher,
FIBContainerView<? extends FIBContainer, JComponent> container) {
container.getJComponent().addMouseListener(editorLauncher);
for (FIBComponent c : container.getComponent().getSubComponents()) {
FIBView<?, ?> subView = container.getController().viewForComponent(c);
if (subView instanceof FIBContainerView) {
recursivelyAddEditorLauncher(editorLauncher, (FIBContainerView) subView);
}
}
}
public final <M extends FIBComponent> FIBView<M, ?> buildView(M fibComponent) {
if (fibComponent instanceof FIBContainer) {
return buildContainer((FIBContainer) fibComponent);
} else if (fibComponent instanceof FIBWidget) {
FIBWidgetView widgetView = buildWidget((FIBWidget) fibComponent);
if (widgetView != null) {
return widgetView;
}
}
return null;
}
protected final FIBView buildContainer(FIBContainer fibContainer) {
FIBView returned = makeContainer(fibContainer);
if (returned != null && fibContainer.isRootComponent()) {
if (returned instanceof FIBContainerView && allowsFIBEdition()) {
EditorLauncher editorLauncher = new EditorLauncher(this, fibContainer);
recursivelyAddEditorLauncher(editorLauncher, (FIBContainerView) returned);
}
return returned;
}
if (returned != null) {
returned.updateGraphicalProperties();
}
return returned;
}
protected final FIBView makeContainer(FIBContainer fibContainer) {
return getViewFactory().makeContainer(fibContainer);
}
protected final FIBWidgetView buildWidget(final FIBWidget fibWidget) {
final FIBWidgetView returned = makeWidget(fibWidget);
returned.getDynamicJComponent().addMouseListener(new MouseAdapter() {
private boolean isPopupTrigger = false;
@Override
public void mouseClicked(MouseEvent e) {
if (returned.isEnabled()) {
mouseEvent = e;
fireMouseClicked(returned.getDynamicModel(), e.getClickCount());
if (fibWidget.hasRightClickAction()
&& (e.isPopupTrigger() || e.getButton() == MouseEvent.BUTTON3 || ToolBox.isMacOS() && isPopupTrigger)) {
// Detected right-click associated with action
returned.applyRightClickAction(e);
// fibWidget.getRightClickAction().execute(FIBController.this);
} else if (fibWidget.hasClickAction() && e.getClickCount() == 1) {
// Detected click associated with action
returned.applySingleClickAction(e);
// fibWidget.getClickAction().execute(FIBController.this);
} else if (fibWidget.hasDoubleClickAction() && e.getClickCount() == 2) {
// Detected double-click associated with action
returned.applyDoubleClickAction(e);
// fibWidget.getDoubleClickAction().execute(FIBController.this);
}
}
isPopupTrigger = false;
}
@Override
public void mouseReleased(MouseEvent e) {
isPopupTrigger = e.isPopupTrigger();
}
});
returned.getDynamicJComponent().addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (fibWidget.hasEnterPressedAction() && e.getKeyCode() == KeyEvent.VK_ENTER) {
// Detected double-click associated with action
fibWidget.getEnterPressedAction().execute(FIBController.this);
}
}
});
if (StringUtils.isNotEmpty(fibWidget.getTooltipText())) {
returned.getDynamicJComponent().setToolTipText(fibWidget.getTooltipText());
}
returned.updateGraphicalProperties();
return returned;
}
protected final FIBWidgetView makeWidget(FIBWidget fibWidget) {
return getViewFactory().makeWidget(fibWidget);
}
@Override
public void update(Observable o, Object arg) {
// System.out.println("Received "+arg);
getRootView().updateDataObject(dataObject);
}
public void show() {
Window w = retrieveWindow();
if (w != null) {
w.setVisible(true);
}
}
public void hide() {
Window w = retrieveWindow();
if (w != null) {
w.setVisible(false);
}
}
private Window retrieveWindow() {
Component c = SwingUtilities.getRoot(getRootView().getJComponent());
if (c instanceof Window) {
return (Window) c;
}
return null;
}
public void validateAndDispose() {
status = Status.VALIDATED;
Window w = retrieveWindow();
if (w != null) {
w.dispose();
}
}
public void cancelAndDispose() {
status = Status.CANCELED;
Window w = retrieveWindow();
if (w != null) {
w.dispose();
}
}
public void abortAndDispose() {
status = Status.ABORTED;
Window w = retrieveWindow();
if (w != null) {
w.dispose();
}
}
public void resetAndDispose() {
status = Status.RESET;
Window w = retrieveWindow();
if (w != null) {
w.dispose();
}
}
public void chooseYesAndDispose() {
status = Status.YES;
Window w = retrieveWindow();
if (w != null) {
w.dispose();
}
}
public void chooseNoAndDispose() {
status = Status.NO;
Window w = retrieveWindow();
if (w != null) {
w.dispose();
}
}
public void chooseQuitAndDispose() {
status = Status.QUIT;
Window w = retrieveWindow();
if (w != null) {
w.dispose();
}
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
public FIBLocalizedDictionary getLocalizer() {
return getLocalizerForComponent(null);
}
public FIBLocalizedDictionary getLocalizerForComponent(FIBComponent component) {
if (getRootComponent() != null) {
FIBLocalizedDictionary returned = getRootComponent().retrieveFIBLocalizedDictionary();
if (getParentLocalizer() != null) {
returned.setParent(getParentLocalizer());
}
return returned;
} else {
logger.warning("Could not find localizer");
return null;
}
}
/**
* Return parent localizer for component localizer
*
* @return
*/
public final LocalizedDelegate getParentLocalizer() {
return parentLocalizer;
}
/**
* Sets parent localizer for component localizer
*
* @param parentLocalizer
*/
public void setParentLocalizer(LocalizedDelegate parentLocalizer) {
this.parentLocalizer = parentLocalizer;
}
public void switchToLanguage(Language language) {
FlexoLocalization.setCurrentLanguage(language);
getRootView().updateLanguage();
}
public void searchNewLocalizationEntries() {
logger.fine("Search new localization entries");
Language currentLanguage = FlexoLocalization.getCurrentLanguage();
getRootComponent().retrieveFIBLocalizedDictionary().beginSearchNewLocalizationEntries();
for (Language language : Language.availableValues()) {
switchToLanguage(language);
}
getRootComponent().retrieveFIBLocalizedDictionary().endSearchNewLocalizationEntries();
getRootComponent().retrieveFIBLocalizedDictionary().refresh();
switchToLanguage(currentLanguage);
setChanged();
notifyObservers();
}
public void refreshLocalized() {
setChanged();
notifyObservers();
}
public FIBSelectable getSelectionLeader() {
return selectionLeader;
}
public FIBSelectable getLastFocusedSelectable() {
return lastFocusedSelectable;
}
public FIBWidgetView getFocusedWidget() {
return focusedWidget;
}
public void setFocusedWidget(FIBWidgetView newFocusedWidget) {
// logger.info("Focused widget is now "+newFocusedWidget.getComponent()+" was="+(focusedWidget!=null?focusedWidget.getComponent():null));
if (newFocusedWidget != focusedWidget) {
FIBWidgetView oldFocusedWidget = focusedWidget;
focusedWidget = newFocusedWidget;
if (oldFocusedWidget != null) {
oldFocusedWidget.getJComponent().repaint();
}
if (newFocusedWidget != null) {
newFocusedWidget.getJComponent().repaint();
if (newFocusedWidget.isSelectableComponent()) {
lastFocusedSelectable = newFocusedWidget.getSelectableComponent();
if (lastFocusedSelectable.synchronizedWithSelection()) {
selectionLeader = newFocusedWidget.getSelectableComponent();
logger.info("Selection LEADER is now " + selectionLeader);
fireSelectionChanged((FIBSelectable) newFocusedWidget);
}
}
}
}
}
public boolean isFocused(FIBWidgetView widget) {
return focusedWidget == widget;
}
public void updateSelection(FIBSelectable widget, List<Object> oldSelection, List<Object> newSelection) {
if (widget == selectionLeader) {
fireSelectionChanged(widget);
List<Object> objectsToRemoveFromSelection = new Vector<Object>();
List<Object> objectsToAddToSelection = new Vector<Object>();
if (oldSelection != null) {
objectsToRemoveFromSelection.addAll(oldSelection);
}
for (Object o : newSelection) {
if (oldSelection != null && oldSelection.contains(o)) {
objectsToRemoveFromSelection.remove(o);
} else {
objectsToAddToSelection.add(o);
}
}
Enumeration<FIBView<?, ?>> en = getViews();
while (en.hasMoreElements()) {
FIBView<?, ?> v = en.nextElement();
if (v.isSelectableComponent() && v.getSelectableComponent() != selectionLeader
&& v.getSelectableComponent().synchronizedWithSelection()) {
for (Object o : objectsToAddToSelection) {
if (v.getSelectableComponent().mayRepresent(o)) {
v.getSelectableComponent().objectAddedToSelection(o);
}
}
for (Object o : objectsToRemoveFromSelection) {
if (v.getSelectableComponent().mayRepresent(o)) {
v.getSelectableComponent().objectRemovedFromSelection(o);
}
}
}
}
}
}
public void objectAddedToSelection(Object o) {
logger.fine("FIBController: objectAddedToSelection(): " + o);
Enumeration<FIBView<?, ?>> en = getViews();
while (en.hasMoreElements()) {
FIBView<?, ?> v = en.nextElement();
if (v.isSelectableComponent() && v.getSelectableComponent().synchronizedWithSelection()) {
if (v.getSelectableComponent().mayRepresent(o)) {
v.getSelectableComponent().objectAddedToSelection(o);
selectionLeader = v.getSelectableComponent();
lastFocusedSelectable = selectionLeader;
}
}
}
}
public void objectRemovedFromSelection(Object o) {
logger.fine("FIBController: objectRemovedFromSelection(): " + o);
Enumeration<FIBView<?, ?>> en = getViews();
while (en.hasMoreElements()) {
FIBView<?, ?> v = en.nextElement();
if (v.isSelectableComponent() && v.getSelectableComponent().synchronizedWithSelection()) {
if (v.getSelectableComponent().mayRepresent(o)) {
v.getSelectableComponent().objectRemovedFromSelection(o);
}
}
}
}
public void selectionCleared() {
logger.fine("FIBController: selectionCleared()");
Enumeration<FIBView<?, ?>> en = getViews();
while (en.hasMoreElements()) {
FIBView<?, ?> v = en.nextElement();
if (v.isSelectableComponent() && v.getSelectableComponent().synchronizedWithSelection()) {
v.getSelectableComponent().selectionResetted();
}
}
}
private void fireSelectionChanged(FIBSelectable leader) {
// External synchronization
for (FIBSelectionListener l : selectionListeners) {
if (selectionLeader != null) {
l.selectionChanged(selectionLeader.getSelection());
}
}
}
public void fireMouseClicked(FIBComponentDynamicModel dm, int clickCount) {
for (FIBMouseClickListener l : mouseClickListeners) {
l.mouseClicked(dm, clickCount);
}
}
public void addSelectionListener(FIBSelectionListener l) {
selectionListeners.add(l);
}
public void removeSelectionListener(FIBSelectionListener l) {
selectionListeners.remove(l);
}
public void addMouseClickListener(FIBMouseClickListener l) {
mouseClickListeners.add(l);
}
public void removeMouseClickListener(FIBMouseClickListener l) {
mouseClickListeners.remove(l);
}
protected class DefaultFIBViewFactory implements FIBViewFactory {
@Override
public FIBView makeContainer(FIBContainer fibContainer) {
if (fibContainer instanceof FIBTab) {
return new FIBTabView((FIBTab) fibContainer, FIBController.this);
} else if (fibContainer instanceof FIBPanel) {
return new FIBPanelView((FIBPanel) fibContainer, FIBController.this);
} else if (fibContainer instanceof FIBTabPanel) {
return new FIBTabPanelView((FIBTabPanel) fibContainer, FIBController.this);
} else if (fibContainer instanceof FIBSplitPanel) {
return new FIBSplitPanelView((FIBSplitPanel) fibContainer, FIBController.this);
}
return null;
}
@Override
public FIBWidgetView makeWidget(FIBWidget fibWidget) {
if (fibWidget instanceof FIBTextField) {
return new FIBTextFieldWidget((FIBTextField) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBTextArea) {
return new FIBTextAreaWidget((FIBTextArea) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBTextPane) {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Can't handle TextPane yet");
}
return new FIBEditorPaneWidget((FIBEditorPane) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBEditorPane) {
return new FIBEditorPaneWidget((FIBEditorPane) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBTextArea) {
return new FIBTextAreaWidget((FIBTextArea) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBHtmlEditor) {
return new FIBHtmlEditorWidget((FIBHtmlEditor) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBLabel) {
return new FIBLabelWidget((FIBLabel) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBImage) {
return new FIBImageWidget((FIBImage) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBCheckBox) {
return new FIBCheckBoxWidget((FIBCheckBox) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBTable) {
return new FIBTableWidget((FIBTable) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBBrowser) {
return new FIBBrowserWidget((FIBBrowser) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBDropDown) {
return new FIBDropDownWidget((FIBDropDown) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBList) {
return new FIBListWidget((FIBList) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBNumber) {
FIBNumber w = (FIBNumber) fibWidget;
switch (w.getNumberType()) {
case ByteType:
return new FIBNumberWidget.FIBByteWidget(w, FIBController.this);
case ShortType:
return new FIBNumberWidget.FIBShortWidget(w, FIBController.this);
case IntegerType:
return new FIBNumberWidget.FIBIntegerWidget(w, FIBController.this);
case LongType:
return new FIBNumberWidget.FIBLongWidget(w, FIBController.this);
case FloatType:
return new FIBNumberWidget.FIBFloatWidget(w, FIBController.this);
case DoubleType:
return new FIBNumberWidget.FIBDoubleWidget(w, FIBController.this);
default:
break;
}
}
if (fibWidget instanceof FIBColor) {
return new FIBColorWidget((FIBColor) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBFont) {
return new FIBFontWidget((FIBFont) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBFile) {
return new FIBFileWidget((FIBFile) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBButton) {
return new FIBButtonWidget((FIBButton) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBRadioButtonList) {
return new FIBRadioButtonListWidget((FIBRadioButtonList) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBCheckboxList) {
return new FIBCheckboxListWidget((FIBCheckboxList) fibWidget, FIBController.this);
}
if (fibWidget instanceof FIBCustom) {
return new FIBCustomWidget((FIBCustom) fibWidget, FIBController.this);
}
return null;
}
}
private static class EditorLauncher extends MouseAdapter {
private FIBComponent component;
private FIBController controller;
public EditorLauncher(FIBController controller, FIBComponent component) {
logger.fine("make EditorLauncher for component: " + component.getDefinitionFile());
this.component = component;
this.controller = controller;
}
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
if (e.isAltDown()) {
controller.openFIBEditor(component, e);
}
}
}
protected void openFIBEditor(final FIBComponent component, MouseEvent event) {
if (component.getDefinitionFile() == null) {
try {
File fibFile = File.createTempFile("FIBComponent", ".fib");
component.setDefinitionFile(fibFile.getAbsolutePath());
FIBLibrary.save(component, fibFile);
} catch (IOException e) {
e.printStackTrace();
logger.warning("Cannot create FIB temp file definition for component, aborting FIB edition");
return;
}
}
try {
File fibFile = new File(component.getDefinitionFile());
if (!fibFile.exists()) {
logger.warning("Cannot find FIB file definition for component, aborting FIB edition");
return;
}
Class embeddedEditor = Class.forName("org.openflexo.fib.editor.FIBEmbeddedEditor");
Constructor c = embeddedEditor.getConstructors()[0];
Object[] args = new Object[2];
args[0] = fibFile;
args[1] = getDataObject();
logger.info("Opening FIB editor for " + component.getDefinitionFile());
c.newInstance(args);
} catch (ClassNotFoundException e) {
logger.warning("Cannot open FIB Editor, please add org.openflexo.fib.editor.FIBEmbeddedEditor in the class path");
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected boolean allowsFIBEdition() {
return true;
}
public MouseEvent getMouseEvent() {
return mouseEvent;
}
public void setMouseEvent(MouseEvent mouseEvent) {
this.mouseEvent = mouseEvent;
}
/**
* Called when a throwable has been raised during model code invocation. Requires to be overriden, this base implementation just log
* exception
*
* @param t
* @return true is exception was correctely handled
*/
public boolean handleException(Throwable t) {
logger.warning("Unexpected exception raised: " + t.getMessage());
t.printStackTrace();
return false;
}
}