1 19 package org.netbeans.modules.xml.schema.ui.basic.wizard; 20 21 import java.awt.Component ; 23 import java.io.IOException ; 24 import java.util.ArrayList ; 25 import java.util.Arrays ; 26 import java.util.Collections ; 27 import java.util.HashSet ; 28 import java.util.Iterator ; 29 import java.util.List ; 30 import java.util.NoSuchElementException ; 31 import java.util.Set ; 32 import javax.swing.JComponent ; 33 import javax.swing.event.ChangeListener ; 34 import javax.swing.event.ChangeEvent ; 35 import javax.swing.event.UndoableEditListener ; 36 37 import org.netbeans.api.project.Project; 39 import org.netbeans.api.project.ProjectUtils; 40 import org.netbeans.api.project.SourceGroup; 41 import org.netbeans.api.project.Sources; 42 import org.netbeans.editor.BaseDocument; 43 import org.netbeans.modules.xml.xam.ui.ProjectConstants; 44 import org.openide.WizardDescriptor; 45 import org.openide.filesystems.FileObject; 46 import org.openide.loaders.DataFolder; 47 import org.openide.loaders.DataObject; 48 import org.openide.util.NbBundle; 49 import org.openide.cookies.EditCookie; 50 import org.openide.cookies.EditorCookie; 51 import org.openide.cookies.SaveCookie; 52 import org.openide.loaders.TemplateWizard; 53 import org.netbeans.spi.project.ui.templates.support.Templates; 54 55 56 67 public class SchemaWizardIterator extends Object implements TemplateWizard.Iterator { 68 69 private static final long serialVersionUID = 1L; 70 private int index; 71 private final Set <ChangeListener > changeListeners = new HashSet <ChangeListener >(); 72 private transient WizardDescriptor.Panel[] panels; 73 private transient WizardDescriptor.Panel schemaPanel; 74 private SchemaAdditionalInfoGUI schemaGUI; 75 76 79 protected WizardDescriptor.Panel[] createPanels (Project project, 80 final TemplateWizard wizard) { 81 Sources sources = ProjectUtils.getSources(project); 82 List <SourceGroup> roots = new ArrayList <SourceGroup>(); 83 SourceGroup[] javaRoots = 84 sources.getSourceGroups(ProjectConstants.JAVA_SOURCES_TYPE); 85 roots.addAll(Arrays.asList(javaRoots)); 86 if (roots.isEmpty()) { 87 SourceGroup[] sourceGroups = sources.getSourceGroups(Sources.TYPE_GENERIC); 88 roots.addAll(Arrays.asList(sourceGroups)); 89 } 90 schemaPanel = new SchemaAdditionalInfoPanel(); 91 schemaGUI = (SchemaAdditionalInfoGUI) schemaPanel.getComponent(); 92 DataFolder folder = DataFolder.findFolder(roots.get(0).getRootFolder()); 93 DataFolder projectFolder = 94 DataFolder.findFolder(project.getProjectDirectory()); 95 try { 96 if (wizard.getTargetFolder().equals(projectFolder)) { 97 wizard.setTargetFolder(folder); 98 } 99 } catch (IOException ioe) { 100 wizard.setTargetFolder(folder); 101 } 102 WizardDescriptor.Panel panel = 103 Templates.createSimpleTargetChooser(project, 104 roots.toArray(new SourceGroup[roots.size()]), schemaPanel); 105 schemaGUI.setParentPanel(panel); 106 return new WizardDescriptor.Panel[] {panel}; 107 } 108 109 112 public void initialize(TemplateWizard wizard) { 113 index = 0; 114 Project project = Templates.getProject( wizard ); 115 panels = createPanels (project, wizard); 116 117 Object prop = wizard.getProperty ("WizardPanel_contentData"); String [] beforeSteps = null; 120 if (prop instanceof String []) { 121 beforeSteps = (String [])prop; 122 } 123 String [] steps = createSteps (beforeSteps, panels); 124 125 for (int i = 0; i < panels.length; i++) { 126 Component c = panels[i].getComponent (); 127 if (steps[i] == null) { 128 steps[i] = c.getName (); 132 } 133 if (c instanceof JComponent ) { JComponent jc = (JComponent ) c; 135 jc.putClientProperty ("WizardPanel_contentSelectedIndex", Integer.valueOf(i)); jc.putClientProperty ("WizardPanel_contentData", steps); } 140 } 141 } 142 143 146 public void uninitialize (TemplateWizard wiz) { 147 panels = null; 148 } 149 150 153 public Set instantiate (TemplateWizard wizard) throws IOException { 154 String tns = schemaGUI.getTargetNamespace(); 155 156 FileObject dir = Templates.getTargetFolder( wizard ); 157 DataFolder df = DataFolder.findFolder( dir ); 158 FileObject template = Templates.getTemplate( wizard ); 159 DataObject dTemplate = DataObject.find( template ); 160 DataObject dobj = dTemplate.createFromTemplate( df, Templates.getTargetName( wizard ) ); 161 if (dobj == null) 162 return Collections.emptySet(); 163 164 EditCookie edit = (EditCookie) dobj.getCookie (EditCookie.class); 165 if (edit != null) { 166 EditorCookie editorCookie = (EditorCookie)dobj.getCookie(EditorCookie.class); 167 BaseDocument doc = (BaseDocument)editorCookie.openDocument(); 168 UndoableEditListener [] listeners = doc.getUndoableEditListeners(); 169 for(UndoableEditListener l : listeners) { 170 doc.removeUndoableEditListener(l); 171 } 172 if(tns.length() == 0) tns = SchemaAdditionalInfoGUI.DEFAULT_TARGET_NAMESPACE; 173 replaceInDocument(doc, "#TARGET_NAMESPACE", tns); 175 SaveCookie save = (SaveCookie)dobj.getCookie(SaveCookie.class); 176 if (save!=null) save.save(); 177 for(UndoableEditListener l : listeners) { 178 doc.addUndoableEditListener(l); 179 } 180 } 181 return Collections.singleton(dobj.getPrimaryFile()); 182 } 183 184 187 public void addChangeListener(ChangeListener listener) { 188 changeListeners.add(listener); 189 } 190 191 195 public void removeChangeListener(ChangeListener listener) { 196 changeListeners.remove(listener); 197 } 198 199 202 public void fireStateChanged() { 203 ChangeEvent event = new ChangeEvent (this); 204 205 Iterator <ChangeListener > i = changeListeners.iterator(); 206 while (i.hasNext()) { 207 try { 208 i.next().stateChanged(event); 209 } catch (Exception e) { 210 } 212 } 213 } 214 215 218 public String name () { 219 return NbBundle.getMessage(SchemaWizardIterator.class, "TITLE_x_of_y", 220 Integer.valueOf(index + 1), Integer.valueOf(panels.length)); 221 } 222 223 226 public boolean hasNext () { 227 return index < panels.length - 1; 228 } 229 230 233 public boolean hasPrevious () { 234 return index > 0; 235 } 236 237 240 public void nextPanel () { 241 if (! hasNext ()) throw new NoSuchElementException (); 242 index++; 243 } 244 245 248 public void previousPanel () { 249 if (! hasPrevious ()) throw new NoSuchElementException (); 250 index--; 251 } 252 253 256 public WizardDescriptor.Panel current () { 257 return panels[index]; 258 } 259 260 263 private String [] createSteps(String [] before, WizardDescriptor.Panel[] panels) { 264 int diff = 0; 267 if (before == null) { 268 before = new String [0]; 269 } else if (before.length > 0) { 270 diff = ("...".equals (before[before.length - 1])) ? 1 : 0; } 272 String [] res = new String [ (before.length - diff) + panels.length]; 273 for (int i = 0; i < res.length; i++) { 274 if (i < (before.length - diff)) { 275 res[i] = before[i]; 276 } else { 277 res[i] = panels[i - before.length + diff].getComponent ().getName (); 278 } 279 } 280 return res; 281 } 282 283 286 private void replaceInDocument(javax.swing.text.Document document, String replaceFrom, String replaceTo) { 287 javax.swing.text.AbstractDocument doc = (javax.swing.text.AbstractDocument )document; 288 int len = replaceFrom.length(); 289 try { 290 String content = doc.getText(0,doc.getLength()); 291 int index = content.lastIndexOf(replaceFrom); 292 while (index>=0) { 293 doc.replace(index,len,replaceTo,null); 294 content=content.substring(0,index); 295 index = content.lastIndexOf(replaceFrom); 296 } 297 } catch (javax.swing.text.BadLocationException ex){} 298 } 299 300 } 301 | Popular Tags |