@Override
 protected void encodeScript(FacesContext context, AbstractMenu abstractMenu) throws IOException {
   PanelMenu menu = (PanelMenu) abstractMenu;
   String clientId = menu.getClientId(context);
   WidgetBuilder wb = getWidgetBuilder(context);
   wb.init("PanelMenu", menu.resolveWidgetVar(), clientId);
   wb.finish();
 }
  private void addControls() {
    this.setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));
    panelMenu = new PanelMenu();
    panelMenu.setBorder(new EmptyBorder(5, 5, 5, 5));
    panelMenu.setPreferredSize(new Dimension(410, 50));
    add(panelMenu);

    JTabbedPane tabbedPane = new JTabbedPane();
    tabbedPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    ImageIcon icon = createImageIcon("exam.jpg");

    panelExam = new PanelExam();
    tabbedPane.addTab(getText("Exams"), icon, panelExam, getText("Manage.exams"));
    tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);

    icon = createImageIcon("question.png");
    panelQuestion = new PanelQuestion();
    tabbedPane.addTab(getText("Questions"), icon, panelQuestion, getText("Manage.questions"));
    tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);

    icon = createImageIcon("exclamation.png");
    panelAnswer = new PanelAnswer();
    tabbedPane.addTab(getText("Answers"), icon, panelAnswer, getText("Manage.answers"));
    panelAnswer.setPreferredSize(new Dimension(410, 50));
    tabbedPane.setMnemonicAt(2, KeyEvent.VK_3);

    tabbedPane.addChangeListener(
        new ChangeListener() {

          @Override
          public void stateChanged(ChangeEvent e) {
            JTabbedPane source = (JTabbedPane) e.getSource();
            switch (source.getSelectedIndex()) {
              case 0:
                panelExam.refresh();
                break;
              case 1:
                panelQuestion.refresh();
                break;
              case 2:
                panelAnswer.refresh();
                break;
            }
          }
        });
    add(tabbedPane);
    tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
    panelQuestion.refresh();
  }
  @Override
  protected void encodeMarkup(FacesContext context, AbstractMenu abstractMenu) throws IOException {
    ResponseWriter writer = context.getResponseWriter();
    PanelMenu menu = (PanelMenu) abstractMenu;
    String clientId = menu.getClientId(context);
    String style = menu.getStyle();
    String styleClass = menu.getStyleClass();
    styleClass =
        styleClass == null
            ? PanelMenu.CONTAINER_CLASS
            : PanelMenu.CONTAINER_CLASS + " " + styleClass;

    writer.startElement("div", menu);
    writer.writeAttribute("id", clientId, "id");
    writer.writeAttribute("class", styleClass, "styleClass");
    if (style != null) {
      writer.writeAttribute("style", style, "style");
    }
    writer.writeAttribute("role", "menu", null);

    if (menu.getElementsCount() > 0) {
      List<MenuElement> elements = menu.getElements();

      for (MenuElement element : elements) {
        if (element.isRendered() && element instanceof Submenu) {
          encodeRootSubmenu(context, menu, (Submenu) element);
        }
      }
    }

    writer.endElement("div");
  }
  protected void encodeRootSubmenu(FacesContext context, PanelMenu menu, Submenu submenu)
      throws IOException {
    ResponseWriter writer = context.getResponseWriter();
    String style = submenu.getStyle();
    String styleClass = submenu.getStyleClass();
    styleClass =
        styleClass == null ? PanelMenu.PANEL_CLASS : PanelMenu.PANEL_CLASS + " " + styleClass;

    // wrapper
    writer.startElement("div", null);
    writer.writeAttribute("class", styleClass, null);
    if (style != null) {
      writer.writeAttribute("style", style, null);
    }

    // header
    writer.startElement("h3", null);
    writer.writeAttribute("class", PanelMenu.HEADER_CLASS, null);
    writer.writeAttribute("role", "tab", null);

    // icon
    writer.startElement("span", null);
    writer.writeAttribute("class", PanelMenu.HEADER_ICON_CLASS, null);
    writer.endElement("span");

    writer.startElement("a", null);
    writer.writeAttribute("href", "#", null);
    writer.writeAttribute("tabindex", "-1", null);
    writer.writeText(submenu.getLabel(), null);
    writer.endElement("a");

    writer.endElement("h3");

    // content
    writer.startElement("div", null);
    writer.writeAttribute("class", PanelMenu.ROOT_SUBMENU_CONTENT, null);
    writer.writeAttribute("role", "tabpanel", null);
    writer.writeAttribute("id", menu.getClientId(context) + "_" + submenu.getId(), null);

    if (submenu.getElementsCount() > 0) {
      List<MenuElement> elements = submenu.getElements();

      writer.startElement("ul", null);
      writer.writeAttribute("class", PanelMenu.LIST_CLASS, null);

      for (MenuElement element : elements) {
        if (element.isRendered()) {
          if (element instanceof MenuItem) {
            writer.startElement("li", null);
            writer.writeAttribute("class", Menu.MENUITEM_CLASS, null);
            writer.writeAttribute("role", "menuitem", null);
            encodeMenuItem(context, menu, (MenuItem) element);
            writer.endElement("li");
          } else if (element instanceof Submenu) {
            encodeDescendantSubmenu(context, menu, (Submenu) element);
          }
        }
      }

      writer.endElement("ul");
    }

    writer.endElement("div"); // content

    writer.endElement("div"); // wrapper
  }