/*
* (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.cgmodule.view.popups;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import java.util.logging.Logger;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import org.openflexo.cgmodule.controller.GeneratorController;
import org.openflexo.components.MultipleObjectSelectorPopup;
import org.openflexo.components.browser.BrowserElement;
import org.openflexo.components.browser.BrowserElementFactory;
import org.openflexo.components.browser.BrowserElementType;
import org.openflexo.components.browser.ProjectBrowser;
import org.openflexo.components.tabular.model.AbstractColumn;
import org.openflexo.components.tabular.model.IconColumn;
import org.openflexo.components.tabular.model.StringColumn;
import org.openflexo.components.widget.MultipleObjectSelector.TabularBrowserConfiguration;
import org.openflexo.foundation.FlexoModelObject;
import org.openflexo.foundation.dm.DMEntity;
import org.openflexo.foundation.dm.DMSet;
import org.openflexo.foundation.dm.DMSet.PackageReference;
import org.openflexo.foundation.dm.DMSet.PackageReference.ClassReference;
import org.openflexo.foundation.dm.DMSet.PackageReference.ClassReference.MethodReference;
import org.openflexo.foundation.dm.DMSet.PackageReference.ClassReference.PropertyReference;
import org.openflexo.foundation.rm.FlexoProject;
import org.openflexo.generator.cg.CGJavaFile;
import org.openflexo.icon.DMEIconLibrary;
import org.openflexo.icon.IconFactory;
import org.openflexo.javaparser.FJPDMSet;
import org.openflexo.javaparser.FJPJavaClass;
import org.openflexo.javaparser.FJPJavaParseException.FJPParseException;
import org.openflexo.javaparser.FJPJavaSource;
import org.openflexo.localization.FlexoLocalization;
public class ModelReinjectionPopup extends MultipleObjectSelectorPopup {
static final Logger logger = Logger.getLogger(ModelReinjectionPopup.class.getPackage().getName());
public ModelReinjectionPopup(String title, String label, Vector<CGJavaFile> javaFiles, FlexoProject project,
GeneratorController controller) throws FJPParseException {
super(title, label, FlexoLocalization.localizedForKey("model_reinjection_description"), "update_model",
new ModelReinjectionBrowserConfiguration(javaFiles, project), project, controller.getFlexoFrame());
Hashtable<FJPJavaClass, Vector<String>> ignoredProperties = new Hashtable<FJPJavaClass, Vector<String>>();
Hashtable<FJPJavaClass, Vector<String>> ignoredMethods = new Hashtable<FJPJavaClass, Vector<String>>();
for (CGJavaFile javaFile : javaFiles) {
if (javaFile.getParseException() != null) {
throw javaFile.getParseException().getParseException();
}
FJPJavaClass parsedClass = javaFile.getParsedJavaSource().getRootClass();
ignoredProperties.put(parsedClass, javaFile.getPropertiesKnownAndIgnored());
ignoredMethods.put(parsedClass, javaFile.getMethodsKnownAndIgnored());
}
getDMSet().notifyKnownAndIgnoredProperties(ignoredProperties);
getDMSet().notifyKnownAndIgnoredMethods(ignoredMethods);
getDMSet().selectAllNewlyDiscoveredPropertiesAndMethods();
choicePanel.setSelectedObjects(getDMSet().getSelectedObjects());
for (CGJavaFile f : javaFiles) {
ClassReference classReference = getDMSet().getClassReference(f.getParsedJavaSource().getRootClass());
if (classReference != null && classReference.isSelected()) {
choicePanel.getTreeTable().getProjectBrowser().expand(classReference, true);
choicePanel.addToSelected(classReference);
}
}
}
public FJPDMSet getDMSet() {
return ((ModelReinjectionBrowserConfiguration) getBrowserConfiguration()).dmSet;
}
protected static class ModelReinjectionBrowserConfiguration implements TabularBrowserConfiguration {
protected FJPDMSet dmSet;
private UpdateClassesBrowserElementFactory _factory;
private FlexoProject _project;
protected ModelReinjectionBrowserConfiguration(Vector<CGJavaFile> javaFiles, FlexoProject project) {
_project = project;
Hashtable<FJPJavaSource, DMEntity> entries = new Hashtable<FJPJavaSource, DMEntity>();
for (CGJavaFile javaFile : javaFiles) {
if (javaFile.getParsedJavaSource() != null) {
entries.put(javaFile.getParsedJavaSource(), javaFile.getModelEntity());
}
}
dmSet = new FJPDMSet(project, "updated_classes", entries);
_factory = new UpdateClassesBrowserElementFactory();
}
@Override
public FlexoProject getProject() {
return _project;
}
@Override
public void configure(ProjectBrowser browser) {
}
@Override
public FlexoModelObject getDefaultRootObject() {
return dmSet;
}
@Override
public BrowserElementFactory getBrowserElementFactory() {
return _factory;
}
class UpdateClassesBrowserElementFactory implements BrowserElementFactory {
@Override
public BrowserElement makeNewElement(FlexoModelObject object, ProjectBrowser browser, BrowserElement parent) {
if (object instanceof DMSet) {
return new ClassSetElement((DMSet) object, browser, parent);
} else if (object instanceof PackageReference) {
return new PackageReferenceElement((PackageReference) object, browser, parent);
} else if (object instanceof ClassReference) {
return new ClassReferenceElement((ClassReference) object, browser, parent);
} else if (object instanceof PropertyReference) {
return new PropertyReferenceElement((PropertyReference) object, browser, parent);
} else if (object instanceof MethodReference) {
return new MethodReferenceElement((MethodReference) object, browser, parent);
}
return null;
}
private class ClassSetElement extends BrowserElement {
public ClassSetElement(DMSet classSet, ProjectBrowser browser, BrowserElement parent) {
super(classSet, BrowserElementType.DM_REPOSITORY, browser, parent);
}
@Override
protected void buildChildrenVector() {
for (Enumeration e = ((DMSet) getObject()).getPackages(); e.hasMoreElements();) {
PackageReference next = (PackageReference) e.nextElement();
addToChilds(next);
}
}
@Override
public String getName() {
return ((DMSet) getObject()).getName();
}
}
private class PackageReferenceElement extends BrowserElement {
public PackageReferenceElement(PackageReference aPackage, ProjectBrowser browser, BrowserElement parent) {
super(aPackage, BrowserElementType.DM_PACKAGE, browser, parent);
}
@Override
protected void buildChildrenVector() {
for (Enumeration e = ((PackageReference) getObject()).getClassesEnumeration(); e.hasMoreElements();) {
ClassReference next = (ClassReference) e.nextElement();
addToChilds(next);
}
}
@Override
public String getName() {
return ((PackageReference) getObject()).getLocalizedName();
}
}
private class ClassReferenceElement extends BrowserElement {
public ClassReferenceElement(ClassReference aClass, ProjectBrowser browser, BrowserElement parent) {
super(aClass, BrowserElementType.DM_ENTITY, browser, parent);
}
@Override
protected void buildChildrenVector() {
for (Enumeration e = ((ClassReference) getObject()).getPropertiesEnumeration(); e.hasMoreElements();) {
PropertyReference next = (PropertyReference) e.nextElement();
addToChilds(next);
}
for (Enumeration e = ((ClassReference) getObject()).getMethodsEnumeration(); e.hasMoreElements();) {
MethodReference next = (MethodReference) e.nextElement();
addToChilds(next);
}
}
@Override
public String getName() {
return ((ClassReference) getObject()).getName();
}
}
private class PropertyReferenceElement extends BrowserElement {
public PropertyReferenceElement(PropertyReference aProperty, ProjectBrowser browser, BrowserElement parent) {
super(aProperty, BrowserElementType.DM_PROPERTY, browser, parent);
}
@Override
protected void buildChildrenVector() {
}
@Override
public String getName() {
return ((PropertyReference) getObject()).getName();
}
@Override
public boolean isSelectable() {
return ((PropertyReference) getObject()).isResolvable();
}
@Override
public Icon getIcon() {
if (!isSelectable()) {
return IconFactory.getDisabledIcon((ImageIcon) super.getIcon());
}
return super.getIcon();
}
@Override
public boolean mustBeHighlighted() {
return ((PropertyReference) getObject()).isNewlyDiscovered() && ((PropertyReference) getObject()).isResolvable();
}
@Override
public boolean mustBeItalic() {
return ((PropertyReference) getObject()).isToBeIgnored();
}
}
private class MethodReferenceElement extends BrowserElement {
public MethodReferenceElement(MethodReference aMethod, ProjectBrowser browser, BrowserElement parent) {
super(aMethod, BrowserElementType.DM_METHOD, browser, parent);
}
@Override
protected void buildChildrenVector() {
}
@Override
public String getName() {
return ((MethodReference) getObject()).getSignature();
}
@Override
public boolean isSelectable() {
return ((MethodReference) getObject()).isResolvable();
}
@Override
public Icon getIcon() {
if (!isSelectable()) {
return IconFactory.getDisabledIcon((ImageIcon) super.getIcon());
}
return super.getIcon();
}
@Override
public boolean mustBeHighlighted() {
return ((MethodReference) getObject()).isNewlyDiscovered() && ((MethodReference) getObject()).isResolvable();
}
@Override
public boolean mustBeItalic() {
return ((MethodReference) getObject()).isToBeIgnored();
}
}
}
IconColumn<FlexoModelObject> getSetColumn;
StringColumn<FlexoModelObject> cardinalityColumn;
StringColumn<FlexoModelObject> typeColumn;
@Override
public AbstractColumn getExtraColumnAt(int index) {
if (index == 0) {
if (getSetColumn == null) {
getSetColumn = new IconColumn<FlexoModelObject>("settable", 25) {
@Override
public Icon getIcon(FlexoModelObject object) {
if (object instanceof PropertyReference) {
if (((PropertyReference) object).isSettable()) {
return DMEIconLibrary.GET_SET_ICON;
} else {
return DMEIconLibrary.GET_ICON;
}
}
return null;
}
@Override
public String getLocalizedTooltip(FlexoModelObject object) {
if (object instanceof PropertyReference) {
if (((PropertyReference) object).isSettable()) {
return FlexoLocalization.localizedForKey("can_be_set");
} else {
return FlexoLocalization.localizedForKey("cannot_be_set");
}
}
return null;
}
};
}
return getSetColumn;
} else if (index == 1) {
if (cardinalityColumn == null) {
cardinalityColumn = new StringColumn<FlexoModelObject>("cardinality", 60) {
@Override
public String getValue(FlexoModelObject object) {
if (object instanceof PropertyReference) {
return ((PropertyReference) object).getCardinality().getLocalizedName();
}
return "";
}
};
}
return cardinalityColumn;
} else if (index == 2) {
if (typeColumn == null) {
typeColumn = new StringColumn<FlexoModelObject>("type", 150) {
@Override
public String getValue(FlexoModelObject object) {
if (object instanceof PropertyReference) {
return ((PropertyReference) object).getTypeName();
} else if (object instanceof MethodReference) {
return ((MethodReference) object).getReturnTypeName();
}
return "";
}
};
}
return typeColumn;
}
return null;
}
@Override
public int getExtraColumnCount() {
return 3;
}
@Override
public int getBrowsingColumnWidth() {
return 300;
}
@Override
public boolean isSelectable(FlexoModelObject object) {
if (object instanceof PropertyReference) {
return ((PropertyReference) object).isResolvable();
} else if (object instanceof MethodReference) {
return ((MethodReference) object).isResolvable();
}
return true;
}
}
@Override
public void performConfirm() {
super.performConfirm();
getDMSet().setSelectedObjects(choicePanel.getSelectedObjects());
}
}