package org.oddjob.monitor.action; import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.util.SortedSet; import java.util.TreeSet; import javax.swing.JPanel; import javax.swing.KeyStroke; import org.oddjob.arooa.ArooaDescriptor; import org.oddjob.arooa.ArooaType; import org.oddjob.arooa.design.screem.Form; import org.oddjob.arooa.design.screem.FormItem; import org.oddjob.arooa.design.screem.LabelledComboBox; import org.oddjob.arooa.design.view.Looks; import org.oddjob.arooa.design.view.SwingFormFactory; import org.oddjob.arooa.design.view.SwingFormView; import org.oddjob.arooa.design.view.SwingItemFactory; import org.oddjob.arooa.design.view.SwingItemView; import org.oddjob.arooa.design.view.ViewHelper; import org.oddjob.arooa.life.InstantiationContext; import org.oddjob.arooa.life.SimpleArooaClass; import org.oddjob.arooa.parsing.ArooaElement; import org.oddjob.arooa.parsing.ConfigurationSession; import org.oddjob.arooa.parsing.DragPoint; import org.oddjob.arooa.parsing.DragTransaction; import org.oddjob.arooa.parsing.QTag; import org.oddjob.arooa.parsing.QTagConfiguration; import org.oddjob.arooa.registry.ChangeHow; import org.oddjob.arooa.xml.XMLArooaParser; import org.oddjob.monitor.Standards; import org.oddjob.monitor.actions.FormAction; import org.oddjob.monitor.context.ExplorerContext; import org.oddjob.monitor.model.ConfigContextSearch; import org.oddjob.monitor.model.JobFormAction; /** * An action that adds a child job to a job. * * @author Rob Gordon */ public class AddJobAction extends JobFormAction implements FormAction { static { // Register or form view. SwingFormFactory.register(AddJobForm.class, new SwingFormFactory<AddJobForm>() { public SwingFormView onCreate(AddJobForm form) { return new AddJobFormView(form); } }); } private LabelledComboBox<QTag> comboBox; private Form form; private ConfigurationSession configurationSession; private DragPoint dragPoint; private Object component; public String getName() { return "Add Job"; } public String getGroup() { return DESIGN_GROUP; } public Integer getMnemonicKey() { return Standards.ADD_JOB_MNEMONIC_KEY; } public KeyStroke getAcceleratorKey() { return Standards.ADD_JOB_ACCELERATOR_KEY; } @Override protected void doPrepare(ExplorerContext explorerContext) { component = explorerContext.getThisComponent(); ConfigContextSearch search = new ConfigContextSearch(); configurationSession = search.sessionForAddJob(explorerContext); dragPoint = null; if (configurationSession != null ) { dragPoint = configurationSession.dragPointFor(component); } if (dragPoint == null || !dragPoint.supportsPaste()) { setEnabled(false); setVisible(false); return; } ArooaDescriptor descriptor = configurationSession.getArooaDescriptor(); InstantiationContext context = new InstantiationContext( ArooaType.COMPONENT, new SimpleArooaClass(Object.class)); ArooaElement[] elements = descriptor.getElementMappings().elementsFor( context); SortedSet<QTag> sortedTags = new TreeSet<QTag>(); for (ArooaElement element : elements) { String prefix = descriptor.getPrefixFor(element.getUri()); sortedTags.add(new QTag(prefix, element)); } QTag[] allOptions = new QTag[elements.length + 1]; allOptions[0] = QTag.NULL_TAG; System.arraycopy(sortedTags.toArray(), 0, allOptions, 1, sortedTags.size()); comboBox = new LabelledComboBox<QTag>(allOptions, "New Job"); form = new AddJobForm(comboBox); setVisible(true); setEnabled(true); } @Override protected void doFree(ExplorerContext explorerContext) { } @Override protected Form doForm() { return form; } @Override protected void doAction() throws Exception { QTag selected = comboBox.getSelected(); if (selected == null || selected == QTag.NULL_TAG) { return; } QTagConfiguration config = new QTagConfiguration(selected); XMLArooaParser parser = new XMLArooaParser(); parser.parse(config); DragTransaction trn = dragPoint.beginChange(ChangeHow.FRESH); try { dragPoint.paste(-1, parser.getXml()); trn.commit(); } catch (Exception e) { trn.rollback(); throw e; } } class AddJobForm implements Form { FormItem formItem; public AddJobForm(FormItem item) { this.formItem = item; } @Override public String getTitle() { return "Add Job"; } public FormItem getFormItem() { return formItem; } } static class AddJobFormView implements SwingFormView { private final AddJobForm standardForm; public AddJobFormView(AddJobForm form) { this.standardForm = form; } public Component cell() { return ViewHelper.createDetailButton(standardForm); } public Component dialog() { JPanel form = new JPanel(); form.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); c.weightx = 1.0; c.weighty = 0.0; c.fill = GridBagConstraints.HORIZONTAL; c.anchor = GridBagConstraints.NORTHWEST; c.insets = new Insets(Looks.DETAIL_FORM_BORDER, Looks.DETAIL_FORM_BORDER, Looks.DETAIL_FORM_BORDER, Looks.DETAIL_FORM_BORDER); c.gridx = 0; c.gridy = 0; int items = 1; for (int i = 0; i < items ; ++i) { c.gridx = 0; c.gridy = i + 1; JPanel panel = new JPanel(); panel.setLayout(new GridBagLayout()); SwingItemView itemView = SwingItemFactory.create( standardForm.getFormItem()); itemView.inline(panel, 0, 0, false); form.add(panel, c); } // pad the bottom. c.weighty = 1.0; form.add(new JPanel(), c); return form; } } }