/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are 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: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.core.api.gui.util; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Window; import java.awt.event.WindowEvent; import java.util.Enumeration; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTree; import javax.swing.JViewport; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import org.weasis.core.api.Messages; @SuppressWarnings("serial") public abstract class AbstractWizardDialog extends JDialog { protected String settingTitle; protected AbstractItemDialogPage currentPage = null; protected DefaultMutableTreeNode pagesRoot = new DefaultMutableTreeNode("root"); //$NON-NLS-1$ private final JPanel jPanelRootPanel = new JPanel(); private final BorderLayout borderLayout3 = new BorderLayout(); protected final JButton jButtonClose = new JButton(); private final BorderLayout borderLayout2 = new BorderLayout(); protected final JTree tree = new JTree(); protected JPanel jPanelButtom = new JPanel(); private final JPanel jPanelMain = new JPanel(); protected JScrollPane jScrollPanePage = new JScrollPane(); private final GridBagLayout gridBagLayout1 = new GridBagLayout(); private final JScrollPane jScrollPane1 = new JScrollPane(); public AbstractWizardDialog(Window window, String title, ModalityType modal, Dimension pageSize) { super(window, title, modal); this.settingTitle = title; jScrollPanePage.setPreferredSize(pageSize); jbInit(); } private void jbInit() { this.setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); jPanelMain.setLayout(borderLayout2); jButtonClose.addActionListener(e -> cancel()); jButtonClose.setText(Messages.getString("AbstractWizardDialog.close")); //$NON-NLS-1$ jPanelRootPanel.setLayout(borderLayout3); jPanelButtom.setLayout(gridBagLayout1); JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jScrollPane1, jPanelMain); jPanelRootPanel.add(splitPane, BorderLayout.CENTER); jPanelMain.add(jScrollPanePage, BorderLayout.CENTER); jPanelRootPanel.add(jPanelButtom, BorderLayout.SOUTH); jPanelButtom.add(jButtonClose, new GridBagConstraints(5, 0, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(10, 10, 10, 15), 0, 0)); jScrollPane1.setViewportView(tree); this.getContentPane().add(jPanelRootPanel, null); } // Overridden so we can exit when window is closed @Override protected void processWindowEvent(WindowEvent e) { if (e.getID() == WindowEvent.WINDOW_CLOSING) { cancel(); } super.processWindowEvent(e); } protected abstract void initializePages(); public void showPageFirstPage() { if (pagesRoot.getChildCount() > 0) { tree.setSelectionRow(0); } } public void showPage(String title) { if (!selectPage(title, pagesRoot)) { showPageFirstPage(); } } private boolean selectPage(String title, DefaultMutableTreeNode root) { if (title != null) { Enumeration<?> children = root.children(); while (children.hasMoreElements()) { Object child = children.nextElement(); if (child instanceof DefaultMutableTreeNode) { DefaultMutableTreeNode dtm = (DefaultMutableTreeNode) child; Object object = dtm.getUserObject(); if (object instanceof PageProps) { PageProps page = (PageProps) object; if (page.getTitle().equals(title)) { TreePath tp = new TreePath(dtm.getPath()); if (!dtm.isLeaf()) { tree.expandPath(tp); } tree.setSelectionPath(tp); return true; } } if (dtm.getChildCount() > 0 && selectPage(title, dtm)) { return true; } } } } return false; } public AbstractItemDialogPage getCurrentPage() { Object object = null; JViewport viewPort = jScrollPanePage.getViewport(); if (viewPort != null && viewPort.getComponentCount() > 0) { object = viewPort.getComponent(0); } if (object instanceof AbstractItemDialogPage) { return (AbstractItemDialogPage) object; } return null; } private void rowslection(AbstractItemDialogPage page) { if (page != null) { if (currentPage != null) { currentPage.deselectPageAction(); } currentPage = page; currentPage.selectPageAction(); jScrollPanePage.setViewportView(currentPage); } } /** * iniTree */ protected void iniTree() { // fill up tree Enumeration<?> children = pagesRoot.children(); while (children.hasMoreElements()) { Object child = children.nextElement(); if (child instanceof DefaultMutableTreeNode) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) child; PageProps[] subpages = null; Object object = node.getUserObject(); if (object instanceof AbstractItemDialogPage) { subpages = ((AbstractItemDialogPage) object).getSubPages(); } if (subpages != null) { for (int j = 0; j < subpages.length; j++) { node.add(new DefaultMutableTreeNode(subpages[j])); } } } } DefaultTreeModel model = new DefaultTreeModel(pagesRoot, false); tree.setModel(model); tree.setShowsRootHandles(true); tree.setRootVisible(false); tree.setExpandsSelectedPaths(true); DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(); renderer.setOpenIcon(null); renderer.setClosedIcon(null); renderer.setLeafIcon(null); tree.setCellRenderer(renderer); tree.addTreeSelectionListener(e -> { if (e.getNewLeadSelectionPath() != null) { DefaultMutableTreeNode object = (DefaultMutableTreeNode) e.getNewLeadSelectionPath().getLastPathComponent(); if (object.getUserObject() instanceof AbstractItemDialogPage) { rowslection((AbstractItemDialogPage) object.getUserObject()); } } }); expandTree(tree, pagesRoot, 2); } public static void expandTree(JTree tree, DefaultMutableTreeNode start, int maxDeep) { if (maxDeep > 1) { Enumeration<?> children = start.children(); while (children.hasMoreElements()) { Object child = children.nextElement(); if (child instanceof DefaultMutableTreeNode) { DefaultMutableTreeNode dtm = (DefaultMutableTreeNode) child; if (!dtm.isLeaf()) { TreePath tp = new TreePath(dtm.getPath()); tree.expandPath(tp); expandTree(tree, dtm, maxDeep - 1); } } } } return; } public void closeAllPages() { Enumeration<?> children = pagesRoot.children(); while (children.hasMoreElements()) { Object child = children.nextElement(); if (child instanceof DefaultMutableTreeNode) { DefaultMutableTreeNode page = (DefaultMutableTreeNode) child; Object object = page.getUserObject(); if (object instanceof AbstractItemDialogPage) { ((AbstractItemDialogPage) object).closeAdditionalWindow(); } } } } protected void resetAlltoDefault() { Enumeration<?> children = pagesRoot.children(); while (children.hasMoreElements()) { Object child = children.nextElement(); if (child instanceof DefaultMutableTreeNode) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) child; Object object = node.getUserObject(); if (object instanceof AbstractItemDialogPage) { AbstractItemDialogPage page = (AbstractItemDialogPage) object; PageProps[] subpages = page.getSubPages(); for (int j = 0; j < subpages.length; j++) { subpages[j].resetoDefaultValues(); } page.resetoDefaultValues(); } } } } public abstract void cancel(); }