class WizardIterator implements WizardDescriptor.Iterator {

    private int index;
    private WizardDescriptor.Panel[] originalPanels;
    private WizardDescriptor.Panel[] panels;
    private ImporterWizardUI currentWizardUI;

    /**
     * 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 WizardPanel1(),
                new WizardPanel2()
            };
            String[] steps = new String[panels.length];
            for (int i = 0; i < panels.length; i++) {
                Component c = panels[i].getComponent();
                // Default step name to component name of panel.
                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(WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, 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);
                }
            }
            originalPanels = panels;
        }
        return panels;
    }

    @Override
    public WizardDescriptor.Panel current() {
        WizardDescriptor.Panel p = getPanels()[index];
//        if(p.getComponent() instanceof SetupablePanel){
//                ((SetupablePanel)(p.getComponent())).setup
//                        (currentSpigotSupport.generateImporter());
//        }
        return p;
    }

    @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();
        }
        //change panel if the current is the  first panel
        if (index == 0) {
            for (ImporterWizardUI wizardUi : Lookup.getDefault().lookupAll(ImporterWizardUI.class)) {
                WizardVisualPanel1 visual1 = ((WizardVisualPanel1) current().getComponent());
                if (visual1.getCurrentCategory().equals(wizardUi.getCategory())
                    && visual1.getCurrentWizard().equals(wizardUi.getDisplayName())) {
                    WizardDescriptor.Panel[] wizardPanels = wizardUi.getPanels();
                    WizardDescriptor.Panel tempFirstPanel = panels[0];
                    panels = new WizardDescriptor.Panel[wizardPanels.length + 1];
                    panels[0] = tempFirstPanel;
                    for (int i = 0; i < wizardPanels.length; i++) {
                        panels[i + 1] = wizardPanels[i];
                        wizardUi.setup(wizardPanels[i]);
                    }
                    currentWizardUI = wizardUi;
                }
            }
            //
            repaintLeftComponent();
        }
        index++;
    }

    /**
     * ? might used for repainting
     */
    private void repaintLeftComponent() {
        String[] steps = new String[panels.length];
        for (int i = 0; i < panels.length; i++) {
            Component c = panels[i].getComponent();
            // Default step name to component name of panel.
            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(WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, 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);
            }
        }
    }

    @Override
    public void previousPanel() {<FILL_FUNCTION_BODY>}

    // If nothing unusual changes in the middle of the wizard, simply:
    @Override
    public void addChangeListener(ChangeListener l) {
    }

    @Override
    public void removeChangeListener(ChangeListener l) {
    }

    public ImporterWizardUI getCurrentWizardUI() {
        return currentWizardUI;
    }

    void unsetupPanels(WizardImporter importer) {
        for (int i = 1; i < panels.length; i++) {
            currentWizardUI.unsetup(importer, panels[i]);
        }
    }
}

        //change panel if the previous panel is the first
        if (!hasPrevious()) {
            throw new NoSuchElementException();
        }
        if (index == 1) {
            panels = originalPanels;
            repaintLeftComponent();
        }
        index--;
    
<no_super_class>