/* * Created on Mar 23, 2007 Copyright (C) 2001-5, Anthony Harrison anh23@pitt.edu * (jactr.org) This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the License, * or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have * received a copy of the GNU Lesser General Public License along with this * library; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA */ package org.jactr.eclipse.ui.wizards.templates; import java.io.File; import java.util.Collection; import java.util.Collections; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.pde.core.plugin.IPluginBase; import org.eclipse.pde.core.plugin.IPluginElement; import org.eclipse.pde.core.plugin.IPluginExtension; import org.eclipse.pde.core.plugin.IPluginModelFactory; import org.eclipse.pde.core.plugin.IPluginReference; import org.eclipse.pde.ui.templates.BooleanOption; import org.eclipse.pde.ui.templates.PluginReference; import org.eclipse.pde.ui.templates.TemplateOption; /** * basic template that contributes a jACT-R Module */ public class ModuleContributorTemplateSection extends BaseACTRContributorTemplateSection { static final public String KEY_CONTRIBUTE_MODULE = "contributeModule"; static final public String KEY_MODULE_CLASS = "moduleClass"; static final public String KEY_MODULE_NAME = "moduleName"; static final public String KEY_PM_MODULE = "isPMModule"; static final public String KEY_CONTRIBUTE_AST = "contributeAST"; static final public String DEFAULT_MODULE_PACKAGE = "edu.yourUniversity.jactr.modules"; static final public String DEFAULT_MODULE_CLASS = "YourModule"; TemplateOption _contributeModule; TemplateOption _modulePackageName; TemplateOption _moduleClassName; TemplateOption _moduleName; TemplateOption _pmModule; TemplateOption _contributeAST; public ModuleContributorTemplateSection() { setPageCount(1); _contributeModule = addOption(KEY_CONTRIBUTE_MODULE, "Create a module", false, 0); _moduleName = addOption(KEY_MODULE_NAME, "Module's name", "", 0); _moduleClassName = addOption(KEY_MODULE_CLASS, "Module class name", DEFAULT_MODULE_CLASS, 0); _modulePackageName = addOption(KEY_PACKAGE_NAME, "Module package", DEFAULT_MODULE_PACKAGE, 0); _pmModule = addOption(KEY_PM_MODULE, "Is an embodied module", false, 0); _contributeAST = addOption( KEY_CONTRIBUTE_AST, "Will this module provide chunk-types, chunks, productions, or buffers", false, 0); _moduleName.setRequired(false); _modulePackageName.setRequired(true); _moduleClassName.setRequired(true); _moduleName.setEnabled(false); _modulePackageName.setEnabled(false); _moduleClassName.setEnabled(false); _pmModule.setEnabled(false); _contributeAST.setEnabled(false); } @Override public void addPages(Wizard wizard) { WizardPage page = createPage(0, null); page.setTitle("Module contribution"); page .setDescription("Does this project contribute a new functional Module to ACT-R? If so, provide the package and class name of the module and it will be generated"); wizard.addPage(page); markPagesAdded(); } @Override protected void updateModel(IProgressMonitor monitor) throws CoreException { if (getBooleanOption(KEY_CONTRIBUTE_MODULE)) { /* * first we set up the module */ IPluginBase plugin = model.getPluginBase(); IPluginExtension extension = createExtension("org.jactr.modules", true); //$NON-NLS-1$ IPluginModelFactory factory = model.getPluginFactory(); IPluginElement moduleElement = factory.createElement(extension); moduleElement.setName("module"); //$NON-NLS-1$ moduleElement.setAttribute("name", getStringOption(KEY_MODULE_NAME)); //$NON-NLS-1$ moduleElement .setAttribute( "class", getStringOption(KEY_PACKAGE_NAME) + "." + getStringOption(KEY_MODULE_CLASS)); //$NON-NLS-1$ //$NON-NLS-2$ moduleElement.setAttribute("requiresCommonReality", "" + getBooleanOption(KEY_PM_MODULE)); moduleElement.setAttribute("defaultEnabled", "false"); IPluginElement descElement = factory.createElement(moduleElement); descElement.setName("description"); descElement.setText("This is the description of your new module"); moduleElement.add(descElement); extension.add(moduleElement); if (!extension.isInTheModel()) plugin.add(extension); /* * and now the ast if applicable */ if (getBooleanOption(KEY_CONTRIBUTE_AST)) { extension = createExtension("org.jactr.io.astparticipants", true); //$NON-NLS-1$ factory = model.getPluginFactory(); IPluginElement participant = factory.createElement(extension); participant.setName("astparticipant"); //$NON-NLS-1$ participant .setAttribute( "contributingClass", getStringOption(KEY_PACKAGE_NAME) + "." + getStringOption(KEY_MODULE_CLASS)); //$NON-NLS-1$ //$NON-NLS-2$ participant.setAttribute("class", getStringOption(KEY_PACKAGE_NAME) + ".ModuleASTParticipant"); participant.setAttribute("content", getStringOption(KEY_PACKAGE_NAME) .replace(".", "/") + "/module-content.jactr"); extension.add(participant); if (!extension.isInTheModel()) plugin.add(extension); } exportPackages(Collections.singleton(getStringOption(KEY_PACKAGE_NAME))); } } @Override public String getLabel() { return "Contributes jACT-R Module"; } public String getUsedExtensionPoint() { return "org.jactr.modules"; } @Override public String getSectionId() { if (getBooleanOption(KEY_CONTRIBUTE_MODULE)) { if (getBooleanOption(KEY_PM_MODULE)) return "pm_module"; return "module"; } return null; } @Override protected boolean isOkToCreateFile(File file) { if (file.getName().endsWith(".jactr") && !getBooleanOption(KEY_CONTRIBUTE_AST)) return false; return true; } @Override public void validateOptions(TemplateOption changed) { if (changed == _contributeModule) { boolean selected = ((BooleanOption) _contributeModule).isSelected(); setOptionEnabled(KEY_MODULE_NAME, selected); setOptionEnabled(KEY_PACKAGE_NAME, selected); setOptionEnabled(KEY_MODULE_CLASS, selected); setOptionEnabled(KEY_PM_MODULE, selected); setOptionEnabled(KEY_CONTRIBUTE_AST, selected); } boolean error = false; for (TemplateOption option : getOptions(0)) if (option.isRequired() && option.isEnabled() && option.isEmpty()) { flagMissingRequiredOption(option); error = true; } if (!error) resetPageState(); } @Override protected Collection<IPluginReference> getDefaultPluginReferences() { Collection<IPluginReference> references = super .getDefaultPluginReferences(); if (getBooleanOption(KEY_PM_MODULE)) references.add(new PluginReference("org.commonreality", null, 0)); return references; } @Override public String getReplacementString(String fileName, String key) { if ("packageLocation".equals(key)) return getStringOption(KEY_PACKAGE_NAME).replace(".", "/"); return super.getReplacementString(fileName, key); } }