/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.editors.dnd; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.ArrayList; import java.util.List; import org.jboss.tools.common.model.ui.editors.dnd.composite.TagProposalsComposite; import org.jboss.tools.common.model.ui.editors.dnd.composite.TagAttributesComposite.AttributeDescriptorValue; public class DefaultDropWizardModel implements IDropWizardModel { ITagProposal fSelectedTagProp = UNDEFINED_TAG_PROPOSAL; DropData fDropData; List<AttributeDescriptorValue> fAttributeValues = new ArrayList<AttributeDescriptorValue>(); boolean promptForTagAttributes = true; ITagProposalFactory tagProposalFactory; IElementGenerator generator; public DefaultDropWizardModel(ITagProposalFactory tagProposalFactory) { this.tagProposalFactory = tagProposalFactory; } public ITagProposal getTagProposal() { return fSelectedTagProp; } /** * @see org.jboss.tools.vpe.editor.dnd.IDnDWizardDataModel#setTagProposal(org.jboss.tools.vpe.editor.dnd.TagProposal) */ public void setTagProposal(ITagProposal selection) { ITagProposal oldValue = fSelectedTagProp; fSelectedTagProp = selection; doLoadTagAttributeDescriptors(); doLoadDefaultAttributeValues(); String uri = getTagProposal().getDetails(); IElementGenerator g = ElementGeneratorFactory.getInstance().getElementGenerator(uri); setElementGenerator(g); fireModelChaged(TAG_PROPOSAL,oldValue,fSelectedTagProp); } /** * */ public void setAttributeValue(AttributeDescriptorValue descrValue, Object value) { // Object oldValue = descrValue.getValue(); descrValue.setValue(value); fireModelChaged(ATTRIBUTE_VALUE,null,descrValue); } /** * */ public void setAttributeValue(String name, Object value) { if(name==null) throw new IllegalArgumentException("Attribute name cannot be null"); //$NON-NLS-1$ AttributeDescriptorValue descrValue = findDescriptor(name); if(descrValue==null) { throw new IllegalArgumentException("Attribute '" + name + "' not found"); //$NON-NLS-1$ //$NON-NLS-2$ } descrValue.setValue(value); fireModelChaged(ATTRIBUTE_VALUE,null,descrValue); } public void setPreferable(String name) { if(name==null) return; AttributeDescriptorValue descrValue = findDescriptor(name); if(descrValue != null) descrValue.setPreferable(true); } private AttributeDescriptorValue findDescriptor(String name) { for (int i = 0; i < fAttributeValues.size(); i++) { AttributeDescriptorValue arrayElement = (AttributeDescriptorValue)fAttributeValues.get(i); if(name.equals(arrayElement.getName())) { return arrayElement; } } return null; } /** * */ public List getAttributeNameList() { return null; } /** * */ public String getAttributeValue(String name) { return null; } /** * */ public void setDropData(DropData data) { fDropData = data; } /** * */ public DropData getDropData() { return fDropData; } /** * */ public AttributeDescriptorValue[] getAttributeValueDescriptors() { return (AttributeDescriptorValue[])fAttributeValues.toArray(new AttributeDescriptorValue[fAttributeValues.size()]); } private void doLoadDefaultAttributeValues() { getTagProposal().getAttributesValueLoader().fillTagAttributes(this); } PropertyChangeSupport pcs = new PropertyChangeSupport(this); /** * */ public void addPropertyChangeListener(PropertyChangeListener listener) { pcs.addPropertyChangeListener(listener); } /** * */ public void removePropertyChangeListener(PropertyChangeListener listener) { pcs.removePropertyChangeListener(listener); } /** * * @param propertyName * @param oldValue * @param newValue */ private void fireModelChaged(String propertyName, Object oldValue, Object newValue) { pcs.firePropertyChange(propertyName,oldValue,newValue); } /** * * */ protected void doLoadTagAttributeDescriptors() { } /** * */ public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { pcs.addPropertyChangeListener(propertyName,listener); } /** * */ public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { pcs.removePropertyChangeListener(propertyName,listener); } /** * Wizard required if there is: * - required or preffered attributes (and VPE preference "always prompt for tag attributes during tag insert" = true) * - more the one tag proposal. */ public boolean isWizardRequired() { if(getTagProposal()!=UNDEFINED_TAG_PROPOSAL && getAttributeValueDescriptors().length==0) { return false; } else if(getTagProposal()!=UNDEFINED_TAG_PROPOSAL && getAttributeValueDescriptors().length>0){ AttributeDescriptorValue[] values = getAttributeValueDescriptors(); for (int i = 0; i < values.length; i++) { AttributeDescriptorValue element = values[i]; if(element.isPreferable() || element.isRequired()) { return true; } } /* * https://jira.jboss.org/jira/browse/JBIDE-4982 * The meaning of showing the dialog * when there are more than 5 value descriptors is unclear. * So it was commented. */ // if(values.length > 5) return true; return isPromptForTagAttributesRequired(); } else if(getTagProposal()==UNDEFINED_TAG_PROPOSAL){ ITagProposal[] proposals = TagProposalsComposite.getTagProposals( getDropData().getMimeType(), getDropData(), tagProposalFactory ); if(proposals.length>1) { return true; } } return false; } public boolean isValid() { if(getTagProposal()==IDropWizardModel.UNDEFINED_TAG_PROPOSAL) { return false; } return true; } public ITagProposalFactory getTagProposalFactory() { return tagProposalFactory; } public boolean isPromptForTagAttributesRequired() { return this.promptForTagAttributes; } public void setPromptForTagAttributesRequired(boolean prompt) { this.promptForTagAttributes = prompt; } public IElementGenerator getElementGenerator() { return generator; } public void setElementGenerator(IElementGenerator g) { generator = g; g.setDataModel(this); } }