/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2016 Neil C Smith. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 3 only, as * published by the Free Software Foundation. * * This code 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 * version 3 for more details. * * You should have received a copy of the GNU General Public License version 3 * along with this work; if not, see http://www.gnu.org/licenses/ * * * Please visit http://neilcsmith.net if you need additional information or * have any questions. */ package net.neilcsmith.praxis.live.project.wizard; import java.awt.Component; import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.NoSuchElementException; import java.util.Set; import javax.swing.JComponent; import javax.swing.event.ChangeListener; import org.openide.WizardDescriptor; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; public final class PraxisProjectWizardIterator implements WizardDescriptor.InstantiatingIterator { private int index; private WizardDescriptor wizard; private WizardDescriptor.Panel[] panels; /** * Initialize panels representing individual wizard's steps and sets * various properties for them influencing wizard appearance. */ private WizardDescriptor.Panel[] getPanels() { if (panels == null) { panels = new WizardDescriptor.Panel[] { new PraxisProjectWizardPanel1() }; // String[] steps = createSteps(); String[] steps = new String[panels.length]; for (int i = 0; i < panels.length; i++) { Component c = panels[i].getComponent(); if (steps[i] == null) { // Default step name to component name of panel. Mainly // useful for getting the name of the target chooser to // appear in the list of steps. steps[i] = c.getName(); } if (c instanceof JComponent) { // assume Swing components JComponent jc = (JComponent) c; // Sets step number of a component // TODO if using org.openide.dialogs >= 7.8, can use WizardDescriptor.PROP_*: jc.putClientProperty("WizardPanel_contentSelectedIndex", new Integer(i)); // Sets steps names for a panel jc.putClientProperty("WizardPanel_contentData", steps); // Turn on subtitle creation on each step jc.putClientProperty("WizardPanel_autoWizardStyle", Boolean.TRUE); // Show steps on the left side with the image on the background jc.putClientProperty("WizardPanel_contentDisplayed", Boolean.TRUE); // Turn on numbering of all steps jc.putClientProperty("WizardPanel_contentNumbered", Boolean.TRUE); } } } return panels; } @Override public Set instantiate() throws IOException { Object o = wizard.getProperty("ProjectDirectory"); File projDir; if (o instanceof File) { projDir = (File) o; } else { throw new IOException("No file in wizard"); } if (projDir.exists()) { throw new IOException("Project directory exists"); } FileObject project = FileUtil.createFolder(projDir); project.createFolder("config"); project.createFolder("resources"); project.createData("project", "pxp"); return Collections.singleton(project); } @Override public void initialize(WizardDescriptor wizard) { this.wizard = wizard; } @Override public void uninitialize(WizardDescriptor wizard) { panels = null; } @Override public WizardDescriptor.Panel current() { return getPanels()[index]; } @Override public String name() { return index + 1 + ". from " + getPanels().length; } @Override public boolean hasNext() { return index < getPanels().length - 1; } @Override public boolean hasPrevious() { return index > 0; } @Override public void nextPanel() { if (!hasNext()) { throw new NoSuchElementException(); } index++; } @Override public void previousPanel() { if (!hasPrevious()) { throw new NoSuchElementException(); } index--; } // If nothing unusual changes in the middle of the wizard, simply: @Override public void addChangeListener(ChangeListener l) { } @Override public void removeChangeListener(ChangeListener l) { } // If something changes dynamically (besides moving between panels), e.g. // the number of panels changes in response to user input, then uncomment // the following and call when needed: fireChangeEvent(); /* private Set<ChangeListener> listeners = new HashSet<ChangeListener>(1); // or can use ChangeSupport in NB 6.0 public final void addChangeListener(ChangeListener l) { synchronized (listeners) { listeners.add(l); } } public final void removeChangeListener(ChangeListener l) { synchronized (listeners) { listeners.remove(l); } } protected final void fireChangeEvent() { Iterator<ChangeListener> it; synchronized (listeners) { it = new HashSet<ChangeListener>(listeners).iterator(); } ChangeEvent ev = new ChangeEvent(this); while (it.hasNext()) { it.next().stateChanged(ev); } } */ // You could safely ignore this method. Is is here to keep steps which were // there before this wizard was instantiated. It should be better handled // by NetBeans Wizard API itself rather than needed to be implemented by a // client code. private String[] createSteps() { String[] beforeSteps = null; Object prop = wizard.getProperty("WizardPanel_contentData"); if (prop != null && prop instanceof String[]) { beforeSteps = (String[]) prop; } if (beforeSteps == null) { beforeSteps = new String[0]; } String[] res = new String[(beforeSteps.length - 1) + panels.length]; for (int i = 0; i < res.length; i++) { if (i < (beforeSteps.length - 1)) { res[i] = beforeSteps[i]; } else { res[i] = panels[i - beforeSteps.length + 1].getComponent().getName(); } } return res; } }