biz.artemis.roadrunner.ui.RoadRunnerGUI.java Source code

Java tutorial

Introduction

Here is the source code for biz.artemis.roadrunner.ui.RoadRunnerGUI.java

Source

package biz.artemis.roadrunner.ui;

import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.util.*;
import java.util.List;
import java.io.IOException;
import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.border.*;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.table.*;

import com.jgoodies.forms.layout.*;
import biz.artemis.roadrunner.model3.*;
import biz.artemis.roadrunner.engine.ConfluenceSynchronizer;
import biz.artemis.confluence.xmlrpcwrapper.*;
import biz.artemis.util.Util;
import org.apache.xmlrpc.XmlRpcException;
import it.cnr.imaa.essi.lablib.gui.checkboxtree.CheckboxTree;
import it.cnr.imaa.essi.lablib.gui.checkboxtree.TreeCheckingModel;
/*
 * Created by JFormDesigner on Tue Nov 11 17:47:48 PST 2008
 *
 * Right now this class contains all the of the GUI screens and action events generated with the JFormDesigner tool
 */

/**
 * @author Brendan Patterson
 */
public class RoadRunnerGUI {
    private RoadRunnerGUIHelper guiHelper = new RoadRunnerGUIHelper();
    private CheckboxTree checkboxTree = new CheckboxTree();

    public RoadRunnerGUI() {
        initComponents();
        initComponents2();
    }

    /**
     * this listens for mouse clicks an launches the popup window
     * on the pageCopy tree
     */
    private MouseAdapter copyPageTreeMenuClickedAdapter = new MouseAdapter() {

        public void mousePressed(MouseEvent e) {
            maybeShowPopup(e);
        }

        public void mouseReleased(MouseEvent e) {
            maybeShowPopup(e);
        }

        private void maybeShowPopup(MouseEvent e) {
            if (e.isPopupTrigger()) {
                int row = checkboxTree.getClosestRowForLocation(e.getX(), e.getY());
                checkboxTree.setSelectionPath(checkboxTree.getPathForRow(row));
                menu.show(checkboxTree, e.getX(), e.getY());
            }
        }
    };
    JPopupMenu menu = new JPopupMenu("Operations");

    /**
     * do anything else needed to initialize the components, but
     * this method contains no generated code. initComponents is generated
     */
    private void initComponents2() {

        refreshServerList();

        getMainFrame().addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent e) {
                System.exit(1);
            }
        });

        serverTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            public void valueChanged(ListSelectionEvent e) {
                if (serverTable.getSelectionModel().getValueIsAdjusting() == true) {
                    serverTable.getSelectionModel().setValueIsAdjusting(false);
                    return;
                }
                UserSettings userSettings = UserSettings.getInstance();
                TreeMap<String, ConfluenceServer> serversMap = userSettings.getConfluenceServersAliasMap();
                DefaultTableModel dataModel = (DefaultTableModel) serverTable.getModel();
                int selectedRow = serverTable.getSelectedRow();
                if (selectedRow < 0)
                    return;
                String selectedAlias = (String) dataModel.getValueAt(selectedRow, 0);
                ConfluenceServer confServer = serversMap.get(selectedAlias);
                serverAliasField.setText(confServer.getServerAlias());
                urlField.setText(confServer.getUrl());
                loginField.setText(confServer.getLogin());
                passwordField.setText(confServer.getPassword());

            }
        });
        refreshSelectedSyncListFromModel();
        setInitialCheckboxTree();
        scrollPane8.setViewportView(checkboxTree);

        /////////////////////////////////
        // add right click pop up menus to the page copy tree
        JMenuItem expandAll = new JMenuItem("Expand all");
        expandAll.setToolTipText("Expands all children");
        JMenuItem selectAllChildren = new JMenuItem("Select All Children");
        selectAllChildren.setToolTipText("check all children nodes");
        JMenuItem unselectChildren = new JMenuItem("Unselect children");
        unselectChildren.setToolTipText("uncheck all child nodes");
        JMenuItem exportHTML = new JMenuItem("Export HTML (of checked nodes)");
        unselectChildren.setToolTipText("Exports HTML for checked nodes");
        exportHTML.addActionListener(exportHTMLActionListener);
        expandAll.addActionListener(expandAllChildrenNodesActionListener);
        selectAllChildren.addActionListener(selectAllChildrenNodesActionListener);
        unselectChildren.addActionListener(unselectAllChildrenNodesActionListener);
        menu.add(expandAll);
        menu.add(selectAllChildren);
        menu.add(unselectChildren);
        menu.addSeparator();
        menu.add(exportHTML);
        checkboxTree.addMouseListener(copyPageTreeMenuClickedAdapter);

        // end - add right click pop up
        /////////////////////////

        //        checkboxTree.setTransferHandler(new TransferHandler() {
        //            public boolean canImport(TransferHandler.TransferSupport support) {
        //                if (!support.isDataFlavorSupported(DataFlavor.stringFlavor) ||
        //                        !support.isDrop()) {
        //                    return false;
        //                }
        //
        //                JTree.DropLocation dropLocation =
        //                        (JTree.DropLocation) support.getDropLocation();
        //
        //                return dropLocation.getPath() != null;
        //            }
        //
        //            public boolean importData(TransferHandler.TransferSupport support) {
        //                if (!canImport(support)) {
        //                    return false;
        //                }
        //
        //                JTree.DropLocation dropLocation =
        //                        (JTree.DropLocation) support.getDropLocation();
        //
        //                TreePath path = dropLocation.getPath();
        //
        //                Transferable transferable = support.getTransferable();
        //
        //                String transferData;
        //                try {
        //                    transferData = (String) transferable.getTransferData(
        //                            DataFlavor.stringFlavor);
        //                } catch (IOException e) {
        //                    return false;
        //                } catch (UnsupportedFlavorException e) {
        //                    return false;
        //                }
        //
        //                int childIndex = dropLocation.getChildIndex();
        //                DefaultTreeModel model = (DefaultTreeModel) checkboxTree.getModel();
        //                if (childIndex == -1) {
        //                    childIndex = model.getChildCount(path.getLastPathComponent());
        //                }
        //
        //                DefaultMutableTreeNode newNode =
        //                        new DefaultMutableTreeNode(transferData);
        //                DefaultMutableTreeNode parentNode =
        //                        (DefaultMutableTreeNode) path.getLastPathComponent();
        //                model.insertNodeInto(newNode, parentNode, childIndex);
        //
        //                TreePath newPath = path.pathByAddingChild(newNode);
        //                pageCopyJTree.makeVisible(newPath);
        //                pageCopyJTree.scrollRectToVisible(pageCopyJTree.getPathBounds(newPath));
        //
        //                return true;
        //            }
        //        });

    }

    /**
     * the default checkbox tree has some dummy data we want to remove and replace
     */
    private void setInitialCheckboxTree() {
        DefaultMutableTreeNode root = new DefaultMutableTreeNode("(Click the Refresh Tree button to get started)");
        DefaultTreeModel model = (DefaultTreeModel) checkboxTree.getModel();
        model.setRoot(root);
    }

    public static void main(String[] args) {
        RoadRunnerGUI gui = new RoadRunnerGUI();
    }

    /**
     * Expands all the child nodes in the tree from a right click
     */
    private ActionListener selectAllChildrenNodesActionListener = new ActionListener() {

        /**
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
         */
        public void actionPerformed(ActionEvent e) {
            TreePath currentSelection = checkboxTree.getSelectionPath();
            if (currentSelection != null) {
                DefaultTreeModel model = ((DefaultTreeModel) checkboxTree.getModel());
                final ConfluenceServer confServer = getGUIHelper()
                        .getCurrentlySelectedConfluenceServer(pageCopyLocalServerComboBox);
                getGUIHelper().jtreeCheckAll(checkboxTree, currentSelection, true);
            }
        }
    };

    /**
     * Expands all the child nodes in the tree from a right click
     */
    private ActionListener unselectAllChildrenNodesActionListener = new ActionListener() {

        /**
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
         */
        public void actionPerformed(ActionEvent e) {
            TreePath currentSelection = checkboxTree.getSelectionPath();
            if (currentSelection != null) {
                DefaultTreeModel model = ((DefaultTreeModel) checkboxTree.getModel());
                final ConfluenceServer confServer = getGUIHelper()
                        .getCurrentlySelectedConfluenceServer(pageCopyLocalServerComboBox);
                getGUIHelper().jtreeCheckAll(checkboxTree, currentSelection, false);
            }
        }
    };

    /**
     * Expands all the child nodes in the tree from a right click
     */
    private ActionListener expandAllChildrenNodesActionListener = new ActionListener() {

        /**
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
         */
        public void actionPerformed(ActionEvent e) {
            TreePath currentSelection = checkboxTree.getSelectionPath();
            if (currentSelection != null) {
                DefaultTreeModel model = ((DefaultTreeModel) checkboxTree.getModel());
                final ConfluenceServer confServer = getGUIHelper()
                        .getCurrentlySelectedConfluenceServer(pageCopyLocalServerComboBox);
                getGUIHelper().jtreeExpandAll(checkboxTree, currentSelection, true);
            }
        }
    };

    /**
     * Example of setting the user object and updating the model. This WILL
     * update the tree correctly.
     */
    private ActionListener exportHTMLActionListener = new ActionListener() {

        /**
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
         */
        public void actionPerformed(ActionEvent e) {
            TreePath currentSelection = checkboxTree.getSelectionPath();
            if (currentSelection != null) {
                DefaultTreeModel model = ((DefaultTreeModel) checkboxTree.getModel());
                //                model.valueForPathChanged(currentSelection, "THIS IS A VERY LOOOOOOOOOOOOOOOOOOOOONG STRING");
                final ConfluenceServer confServer = getGUIHelper()
                        .getCurrentlySelectedConfluenceServer(pageCopyLocalServerComboBox);
                getGUIHelper().exportHTML(checkboxTree, currentSelection, confServer);

            }
        }
    };

    private void removeServerButtonActionPerformed(ActionEvent e) {
        String emptyStr = "";
        serverAliasField.setText(emptyStr);
        urlField.setText(emptyStr);
        loginField.setText(emptyStr);
        passwordField.setText(emptyStr);

        serverTable.getSelectionModel().setValueIsAdjusting(true);
        UserSettings userSettings = UserSettings.getInstance();
        //        TreeMap<String, ConfluenceServer> serversMap = userSettings.getConfluenceServersAliasMap();
        DefaultTableModel dataModel = (DefaultTableModel) serverTable.getModel();
        int selectedRow = serverTable.getSelectedRow();
        String selectedAlias = (String) dataModel.getValueAt(selectedRow, 0);
        userSettings.removeSeverByAlias(selectedAlias);
        refreshServerList();
        serverTable.getSelectionModel().clearSelection();
        userSettings.save();
    }

    /**
     * this convenience method just makes sure we don't get a null result
     *
     * @return
     */
    public String getFieldText(JTextField field) {
        String fieldText = field.getText();
        if (fieldText == null)
            fieldText = "";
        return fieldText.trim();

    }

    /**
     * user clicked on button to add or update server info
     *
     * @param e
     */
    private void addServerButtonActionPerformed(ActionEvent e) {
        UserSettings userSettings = UserSettings.getInstance();
        ConfluenceServer confServer = userSettings.getConfluenceServer(serverAliasField);
        if (confServer == null) {
            confServer = new ConfluenceServer();
        }
        confServer.setServerAlias(getFieldText(serverAliasField));
        confServer.setUrl(getFieldText(urlField));
        confServer.setLogin(getFieldText(loginField));
        confServer.setPassword(getFieldText(passwordField));

        userSettings.updateServersMap(confServer);
        refreshServerList();
        userSettings.save();

    }

    public JFrame getMainFrame() {
        return MainFrame;
    }

    /**
     * updates the servers list when user adds or updates a server
     * <p/>
     * there are several components in the UI that contain a server list and this currently
     * refreshes all of them
     */
    private void refreshServerList() {
        DefaultTableModel dataModel = (DefaultTableModel) serverTable.getModel();
        Map<String, ConfluenceServer> serversMap = UserSettings.getInstance().getConfluenceServersAliasMap();
        Iterator<String> it = serversMap.keySet().iterator();
        dataModel.setRowCount(serversMap.size());
        localServerComboBox.removeAllItems();
        pageCopyLocalServerComboBox.removeAllItems();
        pageCopyRemoteServerComboBox.removeAllItems();
        int i = 0;

        Vector serverListVector = new Vector(serversMap.size());
        while (it.hasNext()) {
            String alias = it.next();
            ConfluenceServer server = serversMap.get(alias);
            dataModel.setValueAt(alias, i, 0);
            dataModel.setValueAt(server.getUrl(), i, 1);
            serverListVector.add(alias);
            localServerComboBox.addItem(alias);
            pageCopyLocalServerComboBox.addItem(alias);
            pageCopyRemoteServerComboBox.addItem(alias);
            i++;
        }

        remoteServerList.setListData(serverListVector);

        serverTable.repaint();
        serverTable.validate();
        //To change body of created methods use File | Settings | File Templates.
    }

    /**
     * this probably isn't needed
     *
     * @param e
     */
    private void serverTablePropertyChange(PropertyChangeEvent e) {
        // TODO add your code here
    }

    RoadRunnerGUIHelper getGUIHelper() {
        return guiHelper;
    }

    /**
     * user clicks on 'refresh' to get spaces from the remote server
     *
     * @param e
     */
    private void spaceRefreshButtonActionPerformed(ActionEvent e) {
        // get the selected server
        ConfluenceServer confluenceServer = getGUIHelper().getCurrentlySelectedConfluenceServer(remoteServerList);

        // retrieve the relevant spaces
        // @todo - can replace this code
        RemoteWikiBroker rwb = RemoteWikiBroker.getInstance();
        List spaceSummaries = null;
        try {
            spaceSummaries = rwb.getSpacesSummaryList(confluenceServer.getConfluenceServerSettingsForXmlRpc());
        } catch (XmlRpcException e1) {
            e1.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
        } catch (IOException e1) {
            e1.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
        }

        // get Vector of String from List of SpaceSummaries
        Vector spaceNames = new Vector(spaceSummaries.size());

        for (int i = 0; i < spaceSummaries.size(); i++) {
            SpaceSummaryForXmlRpc spaceSummaryForXmlRpc = (SpaceSummaryForXmlRpc) spaceSummaries.get(i);
            String spaceName = spaceSummaryForXmlRpc.getSpaceName();
            String spaceKey = spaceSummaryForXmlRpc.getSpaceKey();
            if (spaceName.contains("::"))
                spaceName.replace("::", ";;");
            spaceNames.add(spaceName + " :: " + spaceKey);
        }

        // fill in the combo box with spaces
        spacesToSyncList.setListData(spaceNames);

        // fill in the model for the ConfluenceServer
        confluenceServer.setAllKnownSpaces(spaceSummaries);

        // persist
        UserSettings.getInstance().save();
    }

    /**
     * persist the selections to the model and update the
     * selectedSyncsList UI widget
     *
     * @param e
     */
    private void saveSyncButtonActionPerformed(ActionEvent e) {
        // get the selected ConfluenceServer
        ConfluenceServer confluenceServer = getGUIHelper().getCurrentlySelectedConfluenceServer(remoteServerList);
        // get the selected spaces' keys
        Object selectedValues[] = spacesToSyncList.getSelectedValues();
        if (selectedValues == null || selectedValues.length == 0)
            return;
        List spacesToSync = new ArrayList(selectedValues.length);
        for (int i = 0; i < selectedValues.length; i++) {
            String selectedValue = (String) selectedValues[i];
            SpaceSyncDefinition syncDef = new SpaceSyncDefinition();
            syncDef.setSourceServer(confluenceServer);
            syncDef.setSpaceNameAndKey(selectedValue);
            syncDef.setTargetServer(getGUIHelper().getCurrentlySelectedConfluenceServer(localServerComboBox));
            spacesToSync.add(syncDef);
        }

        // add those keys to the UserSettings - Confluence Servers in the model
        confluenceServer.setSpacesToSync(spacesToSync);

        // created the selected Sync list Strings from the model and update the seletedSyncsList UI widge
        refreshSelectedSyncListFromModel();

        // persist the model
        UserSettings.getInstance().save();

    }

    /**
     * refreshes the sync list
     */
    private void refreshSelectedSyncListFromModel() {
        Vector selectedSyncListCache = new Vector();
        Collection c = UserSettings.getInstance().getConfluenceServersAliasMap().values();
        for (Iterator iterator = c.iterator(); iterator.hasNext();) {
            ConfluenceServer server = (ConfluenceServer) iterator.next();
            List<SpaceSyncDefinition> spacesToSyncForServer = server.getSpacesToSync();
            for (int i = 0; i < spacesToSyncForServer.size(); i++) {
                SpaceSyncDefinition spaceSyncDef = spacesToSyncForServer.get(i);
                selectedSyncListCache.add(spaceSyncDef);
            }
        }
        selectedSyncsList.setListData(selectedSyncListCache);

    }

    /**
     * updates the space list depending on which server is highlighted
     *
     * @param e
     */
    private void remoteServerListValueChanged(ListSelectionEvent e) {
        // get ConfluenceServer from alias
        String serverAlias = (String) remoteServerList.getSelectedValue();
        ConfluenceServer server = UserSettings.getInstance().getConfluenceServersAliasMap().get(serverAlias);
        if (server == null)
            return;

        // populate the spaces list
        List<SpaceSummaryForXmlRpc> allSpaces = server.getAllKnownSpaces();
        if (allSpaces == null) {
            // clears gui list to no components
            spacesToSyncList.setListData(new Object[0]);
            return;
        }

        List<SpaceSyncDefinition> spacesToSync = server.getSpacesToSync();

        Vector allSpacesVector = new Vector(allSpaces.size());
        for (int i = 0; i < allSpaces.size(); i++) {
            SpaceSummaryForXmlRpc spaceSummaryForXmlRpc = allSpaces.get(i);
            allSpacesVector
                    .add(spaceSummaryForXmlRpc.getSpaceName() + " :: " + spaceSummaryForXmlRpc.getSpaceKey());
        }
        spacesToSyncList.setListData(allSpacesVector);

        // highlight the correct spaces
        List<Integer> selectedIndices = new ArrayList(allSpaces.size());
        int intArray[] = new int[allSpaces.size()];
        for (int i = 0; i < allSpaces.size(); i++) {
            intArray[i] = -1;
        }
        int k = 0;
        for (int i = 0; i < allSpaces.size(); i++) {
            String spaceKey = (String) spacesToSyncList.getModel().getElementAt(i);
            spaceKey = spaceKey.split(":: ")[1];
            List<SpaceSyncDefinition> spaceSyncs = server.getSpacesToSync();
            for (int j = 0; j < spaceSyncs.size(); j++) {
                SpaceSyncDefinition spaceSyncDefinition = spaceSyncs.get(j);
                if (spaceKey.equals(spaceSyncDefinition.getSourceSpaceKey())) {
                    intArray[k++] = i;
                }

            }
        }
        spacesToSyncList.setSelectedIndices(intArray);

    }

    /**
     * listen for delete key pressed to remove selected syncs
     *
     * @param e
     */
    private void selectedSyncsListKeyPressed(KeyEvent e) {

        // check that the delete key is being pressed
        if (e.getKeyCode() != 8) {
            return;
        }
        // iterate through values
        Object values[] = selectedSyncsList.getSelectedValues();

        for (int i = 0; i < values.length; i++) {
            SpaceSyncDefinition value = (SpaceSyncDefinition) values[i];
            List spacesToSync = value.getSourceServer().getSpacesToSync();
            spacesToSync.remove(value);
        }
        UserSettings.getInstance().save();

        // refresh this list directly from the model
        refreshSelectedSyncListFromModel();
    }

    private void startSyncButtonActionPerformed(ActionEvent e) {
        // check license
        if (!licenseIsValid()) {
            return;
        }

        // kicking this off in it's own thread allows the GUI to continue rendering
        final biz.artemis.roadrunner.ui.SwingWorker worker = new biz.artemis.roadrunner.ui.SwingWorker() {
            public Object construct() {
                try {
                    ConfluenceSynchronizer.getInstance().synchConfluence();
                } catch (IOException e1) {
                    e1.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
                } catch (XmlRpcException e1) {
                    e1.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
                }
                return null;

            }
        };
        worker.start(); //required for SwingWorker 3

    }

    /**
     * setting this to permanent true since we are now opensourcing
     * @return
     */
    private boolean licenseIsValid() {
        return true;
    }

    /**
     * this is just like a standard sync, but first clears out all
     * the persistent data and in memory data
     *
     * @param e
     */
    private void refreshSyncButtonActionPerformed(ActionEvent e) {
        ContentVersionListContainer.clearForRefresh();
        ContentIdMappingContainer.clearForRefresh();
        startSyncButtonActionPerformed(e);
    }

    /**
     * send the check marked pages to the server
     *
     * @param e
     */
    private void pageCopySendPagesButtonActionPerformed(ActionEvent e) {
        //        // make sure the from and to servers are not the same
        //
        //        // make a list of the checked pages
        //
        //         TreePath checked[] = checkboxTree.getCheckingPaths();
        //        for (int i = 0; i < checked.length; i++) {                          2
        //            TreePath treePath = checked[i];
        //            DefaultMutableTreeNode node = (DefaultMutableTreeNode) treePath.getLastPathComponent();
        //            System.out.println("checked = "+node);
        //        }
        //
        //        // create a ContentVersionListContainer
        //
        //
    }

    /**
     * refresh the JTree of pages
     *
     * @param e
     */
    private void pageCopyRefreshTreeButtonActionPerformed(ActionEvent e) {
        // get the local server info
        ConfluenceServer localServer = getGUIHelper()
                .getCurrentlySelectedConfluenceServer(pageCopyLocalServerComboBox);

        // get the list of spaces
        RemoteWikiBroker rwb = RemoteWikiBroker.getInstance();
        List spaceSummaries = null;
        ConfluenceServerSettings localServerSettings = localServer.getConfluenceServerSettingsForXmlRpc();
        try {
            spaceSummaries = rwb.getSpacesSummaryList(localServerSettings);
        } catch (XmlRpcException e1) {
            e1.printStackTrace();
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        // get Vector of String from List of SpaceSummaries
        //        Vector spaceNames = new Vector(spaceSummaries.size());
        //        DefaultMutableTreeNode root = (DefaultMutableTreeNode) pageCopyJTree.getModel().getRoot();

        // create the tree root
        DefaultMutableTreeNode root = new DefaultMutableTreeNode(localServer.getServerAlias());
        DefaultTreeModel model = (DefaultTreeModel) pageCopyJTree.getModel();
        model.setRoot(root);

        root.setUserObject(localServer.getServerAlias());
        Map<String, DefaultMutableTreeNode> nodeMap = new HashMap<String, DefaultMutableTreeNode>();

        for (int i = 0; i < spaceSummaries.size(); i++) {
            SpaceSummaryForXmlRpc spaceSummaryForXmlRpc = (SpaceSummaryForXmlRpc) spaceSummaries.get(i);
            DefaultMutableTreeNode spaceNode = new DefaultMutableTreeNode(spaceSummaryForXmlRpc.getSpaceName());
            root.add(spaceNode);

            try {
                Vector<PageForXmlRpc> pageSummaries = rwb.getAllServerPageSummaries(localServerSettings,
                        spaceSummaryForXmlRpc.getSpaceKey());
                // put all of the pages into tree nodes
                for (int j = 0; j < pageSummaries.size(); j++) {
                    PageForXmlRpc page = (PageForXmlRpc) pageSummaries.elementAt(j);
                    DefaultMutableTreeNode pageNode = new DefaultMutableTreeNode(page);
                    nodeMap.put(page.getId(), pageNode);
                }
                // create hierarchy by setting the correct parent for each node
                for (int j = 0; j < pageSummaries.size(); j++) {
                    PageForXmlRpc page = (PageForXmlRpc) pageSummaries.elementAt(j);
                    DefaultMutableTreeNode node = nodeMap.get(page.getId());
                    String parentId = page.getParentId();
                    if (Integer.parseInt(parentId) < 1) {
                        // this node has no parents so make the space node it's parent
                        spaceNode.add(node);
                        continue;
                    }
                    DefaultMutableTreeNode parent = nodeMap.get(parentId);
                    //                    node.setParent(parent);
                    parent.add(node);
                    System.out.println("nodeparent = " + parent + " :: node= " + node);
                }

            } catch (IOException e1) {
                e1.printStackTrace();
            } catch (XmlRpcException e1) {
                e1.printStackTrace();
            }

            // clear the map and reuse in next iteration
            nodeMap.clear();
        }

        //        this.checkboxTree = new CheckboxTree(model);
        this.checkboxTree.setModel(model);
        checkboxTree.getCheckingModel().setCheckingMode(TreeCheckingModel.CheckingMode.SIMPLE);

        scrollPane8.setViewportView(checkboxTree);

        pageCopyJTree.updateUI();
        // get all the pages for each space

        // build the tree simply from a map
        // clean up

    }

    /**
     * this method was for a button which is now replaced by the right click menu and removed
     * @param e
     */
    private void pageCopyClearAllButtonActionPerformed(ActionEvent e) {
        checkboxTree.clearChecking();
    }

    /**
     * this method was for a button which is now replaced by the right click menu and removed
     * @param e
     */
    private void pageCopyExpandAllActionPerformed(ActionEvent e) {
        checkboxTree.expandAll();
    }

    private void pageCopySendPagesButton2ActionPerformed(ActionEvent e) {
        pageCopySendPages(false);
    }

    private void pageCopySendPages(final boolean sendAttachments) {
        // make sure the from and to servers are not the same
        final ConfluenceServer localServer = getGUIHelper()
                .getCurrentlySelectedConfluenceServer(pageCopyLocalServerComboBox);
        final ConfluenceServer remoteServer = getGUIHelper()
                .getCurrentlySelectedConfluenceServer(pageCopyRemoteServerComboBox);

        // check that the selected servers are different
        if (localServer.getServerAlias().equals(remoteServer.getServerAlias())) {
            String errorMessage = "the local and remote servers must be different.";
            JOptionPane.showMessageDialog(null, errorMessage, "alert", JOptionPane.ERROR_MESSAGE);
            return;
        }

        // make sure both servers are reachable
        if (!Util.verifyServerConnection(localServer) || !Util.verifyServerConnection(remoteServer)) {
            return;
        }

        final TreePath checkedPaths[] = checkboxTree.getCheckingPaths();

        // kick off the copy in it's own thread
        // check license
        if (!licenseIsValid()) {
            return;
        }

        // kicking this off in it's own thread allows the GUI to continue rendering
        final biz.artemis.roadrunner.ui.SwingWorker worker = new biz.artemis.roadrunner.ui.SwingWorker() {
            public Object construct() {
                ConfluenceSynchronizer.getInstance().pageCopySync(localServer, remoteServer,
                        checkboxTree.getModel(), checkedPaths, sendAttachments);
                return null;

            }
        };
        worker.start(); //required for SwingWorker 3
    }

    private void pageCopySendPagesAndAttachmentsButtonActionPerformed(ActionEvent e) {
        pageCopySendPages(true);
    }

    /**
     * test the selected server's connection
     *
     * @param e
     */
    private void serverTestConnectionButtonActionPerformed(ActionEvent e) {
        UserSettings userSettings = UserSettings.getInstance();
        ConfluenceServer confServer = userSettings.getConfluenceServer(serverAliasField);
        if (confServer == null) {
            confServer = new ConfluenceServer();
        }
        confServer.setServerAlias(getFieldText(serverAliasField));
        confServer.setUrl(getFieldText(urlField));
        confServer.setLogin(getFieldText(loginField));
        confServer.setPassword(getFieldText(passwordField));

        if (Util.verifyServerConnection(confServer)) {
            // connection test was successful
            String successMessage = "Success! The Confluence Server: " + confServer.getServerAlias()
                    + "is accessible.";
            JOptionPane.showMessageDialog(null, successMessage, "alert", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    private void initComponents() {
        // JFormDesigner - Component initialization - DO NOT MODIFY  //GEN-BEGIN:initComponents
        MainFrame = new JFrame();
        mainPanel = new JPanel();
        mainTabbedPane = new JTabbedPane();
        startSyncPanel = new JPanel();
        rrIconLabel = new JLabel();
        startSyncButton = new JButton();
        refreshSyncButton = new JButton();
        confluenceServersPanel = new JPanel();
        serverListPanel = new JPanel();
        scrollPane1 = new JScrollPane();
        serverTable = new JTable();
        serverInfoFormPanel = new JPanel();
        serverAliasLabel = new JLabel();
        serverAliasField = new JTextField();
        label6 = new JLabel();
        urlLabel = new JLabel();
        urlField = new JTextField();
        label2 = new JLabel();
        loginLabel = new JLabel();
        loginField = new JTextField();
        passwordLabel = new JLabel();
        passwordField = new JPasswordField();
        label9 = new JLabel();
        panel8 = new JPanel();
        removeServerButton = new JButton();
        serverTestConnectionButton = new JButton();
        addServerButton = new JButton();
        spacesPanel = new JPanel();
        label1 = new JLabel();
        remoteServerListPanel = new JLabel();
        spacesToSyncListLabel = new JLabel();
        localServerSelectLabel = new JLabel();
        scrollPane2 = new JScrollPane();
        remoteServerList = new JList();
        arrowLabel = new JLabel();
        scrollPane3 = new JScrollPane();
        spacesToSyncList = new JList();
        arrowLabel2 = new JLabel();
        localServerComboBox = new JComboBox();
        spaceRefreshButton = new JButton();
        saveSyncButton = new JButton();
        selectedSyncLabel = new JLabel();
        scrollPane4 = new JScrollPane();
        selectedSyncsList = new JList();
        panel1 = new JPanel();
        panel2 = new JPanel();
        pageCopyLabel1 = new JLabel();
        pageCopyLabel2 = new JLabel();
        pageCopyLocalServerComboBox = new JComboBox();
        pageCopyLabel3 = new JLabel();
        pageCopyRemoteServerComboBox = new JComboBox();
        panel4 = new JPanel();
        scrollPane8 = new JScrollPane();
        pageCopyJTree = new JTree();
        panel3 = new JPanel();
        pageCopyRefreshTreeButton = new JButton();
        panel5 = new JPanel();
        pageCopySendPagesButton2 = new JButton();
        pageCopySendPagesAndAttachmentsButton = new JButton();
        scrollPane9 = new JScrollPane();
        pageCopySelectedListTextArea = new JTextArea();
        historyPanel = new JPanel();
        syncHistoryLabel = new JLabel();
        scrollPane5 = new JScrollPane();
        syncHistoryList = new JList();
        syncHistoryDetailsLabel = new JLabel();
        scrollPane6 = new JScrollPane();
        textArea1 = new JTextArea();
        CellConstraints cc = new CellConstraints();

        //======== MainFrame ========
        {
            MainFrame.setTitle("RoadRunner For Confluence v0.5.0");
            MainFrame.setIconImage(
                    new ImageIcon("/Users/brendan/Desktop/projects/roadrunner/devel/FreeMindWindowIcon.png")
                            .getImage());
            Container MainFrameContentPane = MainFrame.getContentPane();
            MainFrameContentPane.setLayout(new BorderLayout());

            //======== mainPanel ========
            {
                mainPanel.setPreferredSize(new Dimension(660, 442));
                mainPanel.setLayout(new BorderLayout());

                //======== mainTabbedPane ========
                {
                    mainTabbedPane.setBackground(new Color(238, 238, 238));

                    //======== startSyncPanel ========
                    {
                        startSyncPanel.setBackground(Color.white);
                        startSyncPanel.setLayout(new GridBagLayout());
                        ((GridBagLayout) startSyncPanel.getLayout()).columnWidths = new int[] { 6, 78, 6, 0 };
                        ((GridBagLayout) startSyncPanel.getLayout()).rowHeights = new int[] { 0, 5, 32, 0, 0, 0 };
                        ((GridBagLayout) startSyncPanel.getLayout()).columnWeights = new double[] { 0.0, 1.0, 0.0,
                                1.0E-4 };
                        ((GridBagLayout) startSyncPanel.getLayout()).rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0,
                                0.0, 1.0E-4 };

                        //---- rrIconLabel ----
                        rrIconLabel.setIcon(new ImageIcon(getClass().getResource("/rr-logo-v2.png")));
                        startSyncPanel.add(rrIconLabel, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,
                                GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));

                        //---- startSyncButton ----
                        startSyncButton.setText("     Start Sync     ");
                        startSyncButton.setBackground(new Color(0, 204, 0));
                        startSyncButton.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent e) {
                                startSyncButtonActionPerformed(e);
                            }
                        });
                        startSyncPanel.add(startSyncButton, new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0,
                                GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));

                        //---- refreshSyncButton ----
                        refreshSyncButton.setText("Refresh Sync");
                        refreshSyncButton.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent e) {
                                refreshSyncButtonActionPerformed(e);
                            }
                        });
                        startSyncPanel.add(refreshSyncButton,
                                new GridBagConstraints(1, 4, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER,
                                        GridBagConstraints.VERTICAL, new Insets(0, 0, 0, 0), 0, 0));
                    }
                    mainTabbedPane.addTab("Start Sync", startSyncPanel);

                    //======== confluenceServersPanel ========
                    {
                        confluenceServersPanel.setLayout(new FormLayout("default:grow", "default, $lgap, 176dlu"));

                        //======== serverListPanel ========
                        {
                            serverListPanel.setLayout(new FormLayout("default:grow", "fill:80dlu:grow"));

                            //======== scrollPane1 ========
                            {

                                //---- serverTable ----
                                serverTable.setModel(new DefaultTableModel(new Object[][] { { null, null }, },
                                        new String[] { "Server Alias", "Server URL" }) {
                                    Class[] columnTypes = new Class[] { String.class, String.class };
                                    boolean[] columnEditable = new boolean[] { false, false };

                                    @Override
                                    public Class<?> getColumnClass(int columnIndex) {
                                        return columnTypes[columnIndex];
                                    }

                                    @Override
                                    public boolean isCellEditable(int rowIndex, int columnIndex) {
                                        return columnEditable[columnIndex];
                                    }
                                });
                                serverTable.setShowHorizontalLines(false);
                                serverTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                                serverTable.addPropertyChangeListener("selectedRow", new PropertyChangeListener() {
                                    public void propertyChange(PropertyChangeEvent e) {
                                        serverTablePropertyChange(e);
                                    }
                                });
                                scrollPane1.setViewportView(serverTable);
                            }
                            serverListPanel.add(scrollPane1, cc.xy(1, 1));
                        }
                        confluenceServersPanel.add(serverListPanel, cc.xy(1, 1));

                        //======== serverInfoFormPanel ========
                        {
                            serverInfoFormPanel.setBorder(new TitledBorder(null, "Confluence Server Settings",
                                    TitledBorder.LEADING, TitledBorder.TOP));
                            serverInfoFormPanel.setLayout(
                                    new FormLayout("2*(default, $lcgap), [80dlu,default]:grow, 2*($lcgap, default)",
                                            "4*(default, $lgap), default"));

                            //---- serverAliasLabel ----
                            serverAliasLabel.setText("server alias");
                            serverInfoFormPanel.add(serverAliasLabel, cc.xy(3, 1));

                            //---- serverAliasField ----
                            serverAliasField.setColumns(4);
                            serverAliasField.setPreferredSize(new Dimension(83, 28));
                            serverInfoFormPanel.add(serverAliasField, cc.xywh(5, 1, 2, 1));

                            //---- label6 ----
                            label6.setText("a name that identifies the server: my server");
                            serverInfoFormPanel.add(label6, cc.xy(9, 1));

                            //---- urlLabel ----
                            urlLabel.setText("URL");
                            serverInfoFormPanel.add(urlLabel, cc.xy(3, 3));
                            serverInfoFormPanel.add(urlField, cc.xywh(5, 3, 4, 1));

                            //---- label2 ----
                            label2.setText("base url of server i.e. http://localhost:8080");
                            serverInfoFormPanel.add(label2, cc.xy(9, 3));

                            //---- loginLabel ----
                            loginLabel.setText("login");
                            serverInfoFormPanel.add(loginLabel, cc.xy(3, 5));
                            serverInfoFormPanel.add(loginField, cc.xywh(5, 5, 2, 1));

                            //---- passwordLabel ----
                            passwordLabel.setText("password");
                            serverInfoFormPanel.add(passwordLabel, cc.xy(3, 7));
                            serverInfoFormPanel.add(passwordField, cc.xy(5, 7));

                            //---- label9 ----
                            label9.setText("you can leave this blank and will be prompted");
                            serverInfoFormPanel.add(label9, cc.xy(9, 7));

                            //======== panel8 ========
                            {
                                panel8.setLayout(new FlowLayout(FlowLayout.CENTER, 7, 7));

                                //---- removeServerButton ----
                                removeServerButton.setText("Remove");
                                removeServerButton.addActionListener(new ActionListener() {
                                    public void actionPerformed(ActionEvent e) {
                                        removeServerButtonActionPerformed(e);
                                    }
                                });
                                panel8.add(removeServerButton);

                                //---- serverTestConnectionButton ----
                                serverTestConnectionButton.setText("Test Connection");
                                serverTestConnectionButton.addActionListener(new ActionListener() {
                                    public void actionPerformed(ActionEvent e) {
                                        serverTestConnectionButtonActionPerformed(e);
                                    }
                                });
                                panel8.add(serverTestConnectionButton);

                                //---- addServerButton ----
                                addServerButton.setText("Add / Update");
                                addServerButton.addActionListener(new ActionListener() {
                                    public void actionPerformed(ActionEvent e) {
                                        button3ActionPerformed(e);
                                        addServerButtonActionPerformed(e);
                                    }
                                });
                                panel8.add(addServerButton);
                            }
                            serverInfoFormPanel.add(panel8, cc.xywh(5, 9, 5, 1));
                        }
                        confluenceServersPanel.add(serverInfoFormPanel, cc.xy(1, 3));
                    }
                    mainTabbedPane.addTab("Confluence Servers", confluenceServersPanel);

                    //======== spacesPanel ========
                    {
                        spacesPanel.setBorder(new TitledBorder(null, "Synchronization Select", TitledBorder.LEADING,
                                TitledBorder.TOP));
                        spacesPanel.setLayout(new FormLayout(
                                "default:grow, $lcgap, 20dlu, $lcgap, default:grow, $lcgap, 21dlu, $lcgap, default:grow",
                                "5*(default, $lgap), fill:113dlu:grow"));

                        //---- label1 ----
                        label1.setText(
                                "Please select the remote server and spaces to synchronize with your local server.");
                        label1.setForeground(new Color(0, 0, 153));
                        spacesPanel.add(label1, cc.xywh(1, 1, 9, 1));

                        //---- remoteServerListPanel ----
                        remoteServerListPanel.setText("remote server(s)");
                        spacesPanel.add(remoteServerListPanel, cc.xy(1, 3));

                        //---- spacesToSyncListLabel ----
                        spacesToSyncListLabel.setText("spaces to sync");
                        spacesPanel.add(spacesToSyncListLabel, cc.xy(5, 3));

                        //---- localServerSelectLabel ----
                        localServerSelectLabel.setText("local server");
                        spacesPanel.add(localServerSelectLabel, cc.xy(9, 3));

                        //======== scrollPane2 ========
                        {

                            //---- remoteServerList ----
                            remoteServerList.setModel(new AbstractListModel() {
                                String[] values = { "my local server, ", "department server", "corporate server," };

                                public int getSize() {
                                    return values.length;
                                }

                                public Object getElementAt(int i) {
                                    return values[i];
                                }
                            });
                            remoteServerList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                            remoteServerList.addListSelectionListener(new ListSelectionListener() {
                                public void valueChanged(ListSelectionEvent e) {
                                    remoteServerListValueChanged(e);
                                    remoteServerListValueChanged(e);
                                }
                            });
                            scrollPane2.setViewportView(remoteServerList);
                        }
                        spacesPanel.add(scrollPane2, cc.xy(1, 5));

                        //---- arrowLabel ----
                        arrowLabel.setText(">>");
                        arrowLabel.setHorizontalAlignment(SwingConstants.CENTER);
                        spacesPanel.add(arrowLabel, cc.xy(3, 5));

                        //======== scrollPane3 ========
                        {

                            //---- spacesToSyncList ----
                            spacesToSyncList.setModel(new AbstractListModel() {
                                String[] values = { " " };

                                public int getSize() {
                                    return values.length;
                                }

                                public Object getElementAt(int i) {
                                    return values[i];
                                }
                            });
                            scrollPane3.setViewportView(spacesToSyncList);
                        }
                        spacesPanel.add(scrollPane3, cc.xy(5, 5));

                        //---- arrowLabel2 ----
                        arrowLabel2.setText(">>");
                        arrowLabel2.setHorizontalAlignment(SwingConstants.CENTER);
                        spacesPanel.add(arrowLabel2, cc.xy(7, 5));

                        //---- localServerComboBox ----
                        localServerComboBox.setModel(new DefaultComboBoxModel(new String[] { "localhost" }));
                        spacesPanel.add(localServerComboBox, cc.xy(9, 5));

                        //---- spaceRefreshButton ----
                        spaceRefreshButton.setText("Refresh");
                        spaceRefreshButton.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent e) {
                                spaceRefreshButtonActionPerformed(e);
                            }
                        });
                        spacesPanel.add(spaceRefreshButton, cc.xy(5, 7));

                        //---- saveSyncButton ----
                        saveSyncButton.setText("Save Sync");
                        saveSyncButton.addActionListener(new ActionListener() {
                            public void actionPerformed(ActionEvent e) {
                                saveSyncButtonActionPerformed(e);
                                saveSyncButtonActionPerformed(e);
                            }
                        });
                        spacesPanel.add(saveSyncButton, cc.xy(9, 7));

                        //---- selectedSyncLabel ----
                        selectedSyncLabel.setText(
                                "synchronizations selected (these are the spaces RoadRunner will synchronize)");
                        spacesPanel.add(selectedSyncLabel, cc.xywh(1, 9, 9, 1));

                        //======== scrollPane4 ========
                        {

                            //---- selectedSyncsList ----
                            selectedSyncsList.setModel(new AbstractListModel() {
                                String[] values = {
                                        "department server >> ALL Spaces >> my local server  (includes new spaces)",
                                        "corporate server >> Technology >> my local server" };

                                public int getSize() {
                                    return values.length;
                                }

                                public Object getElementAt(int i) {
                                    return values[i];
                                }
                            });
                            selectedSyncsList.addKeyListener(new KeyAdapter() {
                                @Override
                                public void keyPressed(KeyEvent e) {
                                    selectedSyncsListKeyPressed(e);
                                }
                            });
                            scrollPane4.setViewportView(selectedSyncsList);
                        }
                        spacesPanel.add(scrollPane4, cc.xywh(1, 11, 9, 1));
                    }
                    mainTabbedPane.addTab("Spaces", spacesPanel);

                    //======== panel1 ========
                    {
                        panel1.setBackground(new Color(238, 238, 238));
                        panel1.setLayout(new FormLayout("2*(default, $lcgap), 50dlu:grow, 2*($lcgap, default)",
                                "default, $lgap, default:grow, 2*($lgap, default), $lgap, 47dlu:grow"));

                        //======== panel2 ========
                        {
                            panel2.setLayout(new FormLayout("default:grow, $lcgap, default, $lcgap, default:grow",
                                    "default, $lgap, default"));

                            //---- pageCopyLabel1 ----
                            pageCopyLabel1.setText("from server");
                            panel2.add(pageCopyLabel1, cc.xy(1, 1));

                            //---- pageCopyLabel2 ----
                            pageCopyLabel2.setText("to server");
                            panel2.add(pageCopyLabel2, cc.xy(5, 1));
                            panel2.add(pageCopyLocalServerComboBox, cc.xy(1, 3));

                            //---- pageCopyLabel3 ----
                            pageCopyLabel3.setText(">>");
                            panel2.add(pageCopyLabel3, cc.xy(3, 3));
                            panel2.add(pageCopyRemoteServerComboBox, cc.xy(5, 3));
                        }
                        panel1.add(panel2, cc.xy(5, 1));

                        //======== panel4 ========
                        {
                            panel4.setBorder(new TitledBorder(null, "local page tree", TitledBorder.LEADING,
                                    TitledBorder.TOP));
                            panel4.setLayout(new FormLayout("2*(default, $lcgap), 50dlu:grow, 2*($lcgap, default)",
                                    "default:grow"));

                            //======== scrollPane8 ========
                            {
                                scrollPane8.setViewportView(pageCopyJTree);
                            }
                            panel4.add(scrollPane8, cc.xywh(1, 1, 9, 1));
                        }
                        panel1.add(panel4, cc.xywh(1, 3, 9, 1));

                        //======== panel3 ========
                        {
                            panel3.setLayout(new FormLayout("default:grow, $lcgap, default, $lcgap, default:grow",
                                    "default"));

                            //---- pageCopyRefreshTreeButton ----
                            pageCopyRefreshTreeButton.setText("Refresh  Tree");
                            pageCopyRefreshTreeButton.addActionListener(new ActionListener() {
                                public void actionPerformed(ActionEvent e) {
                                    pageCopyRefreshTreeButtonActionPerformed(e);
                                }
                            });
                            panel3.add(pageCopyRefreshTreeButton, cc.xy(3, 1));
                        }
                        panel1.add(panel3, cc.xywh(5, 5, 1, 1, CellConstraints.CENTER, CellConstraints.DEFAULT));

                        //======== panel5 ========
                        {
                            panel5.setLayout(new FormLayout("2*(default, $lcgap), default", "default"));

                            //---- pageCopySendPagesButton2 ----
                            pageCopySendPagesButton2.setText("     Send Pages     ");
                            pageCopySendPagesButton2.addActionListener(new ActionListener() {
                                public void actionPerformed(ActionEvent e) {
                                    pageCopySendPagesButton2ActionPerformed(e);
                                }
                            });
                            panel5.add(pageCopySendPagesButton2,
                                    cc.xywh(3, 1, 1, 1, CellConstraints.CENTER, CellConstraints.DEFAULT));

                            //---- pageCopySendPagesAndAttachmentsButton ----
                            pageCopySendPagesAndAttachmentsButton.setText("Send Pages And Attachments");
                            pageCopySendPagesAndAttachmentsButton.addActionListener(new ActionListener() {
                                public void actionPerformed(ActionEvent e) {
                                    pageCopySendPagesAndAttachmentsButtonActionPerformed(e);
                                }
                            });
                            panel5.add(pageCopySendPagesAndAttachmentsButton, cc.xy(5, 1));
                        }
                        panel1.add(panel5, cc.xywh(5, 7, 1, 1, CellConstraints.CENTER, CellConstraints.DEFAULT));

                        //======== scrollPane9 ========
                        {

                            //---- pageCopySelectedListTextArea ----
                            pageCopySelectedListTextArea.setPreferredSize(new Dimension(0, 48));
                            scrollPane9.setViewportView(pageCopySelectedListTextArea);
                        }
                        panel1.add(scrollPane9, cc.xywh(1, 9, 9, 1));
                    }
                    mainTabbedPane.addTab("Pages", panel1);

                    //======== historyPanel ========
                    {
                        historyPanel
                                .setLayout(new FormLayout("default:grow", "4*(default, $lgap), fill:40dlu:grow"));

                        //---- syncHistoryLabel ----
                        syncHistoryLabel.setText("Synchronization history");
                        historyPanel.add(syncHistoryLabel, cc.xy(1, 1));

                        //======== scrollPane5 ========
                        {

                            //---- syncHistoryList ----
                            syncHistoryList.setModel(new AbstractListModel() {
                                String[] values = { "Jan 5, 2008 - 4:53 p.m.,", "Jan 15, 2008 - 4:53 p.m.,",
                                        "Jan 17, 2008 - 4:53 p.m.,", "Jan 25, 2008 - 4:53 p.m.,",
                                        "Feb 4, 2008 - 4:53 p.m." };

                                public int getSize() {
                                    return values.length;
                                }

                                public Object getElementAt(int i) {
                                    return values[i];
                                }
                            });
                            scrollPane5.setViewportView(syncHistoryList);
                        }
                        historyPanel.add(scrollPane5, cc.xy(1, 3));

                        //---- syncHistoryDetailsLabel ----
                        syncHistoryDetailsLabel.setText("Sync Details");
                        historyPanel.add(syncHistoryDetailsLabel, cc.xy(1, 7));

                        //======== scrollPane6 ========
                        {

                            //---- textArea1 ----
                            textArea1.setText(
                                    "Starting Synch Jan 17th, 2008 - 4:53p.m.\nServer 'Corporate Server'\nChecking space 'Technology' for updates\nFound 6 page updates\nChecking space 'Other' for updates\n\tNo updates found.");
                            scrollPane6.setViewportView(textArea1);
                        }
                        historyPanel.add(scrollPane6, cc.xy(1, 9));
                    }
                    mainTabbedPane.addTab("History", historyPanel);

                }
                mainPanel.add(mainTabbedPane, BorderLayout.CENTER);
            }
            MainFrameContentPane.add(mainPanel, BorderLayout.CENTER);
            MainFrame.pack();
            MainFrame.setLocationRelativeTo(MainFrame.getOwner());
        }
        // JFormDesigner - End of component initialization  //GEN-END:initComponents
    }

    private void button3ActionPerformed(ActionEvent e) {
        //To change body of created methods use File | Settings | File Templates.
    }

    // JFormDesigner - Variables declaration - DO NOT MODIFY  //GEN-BEGIN:variables
    private JFrame MainFrame;
    private JPanel mainPanel;
    private JTabbedPane mainTabbedPane;
    private JPanel startSyncPanel;
    private JLabel rrIconLabel;
    private JButton startSyncButton;
    private JButton refreshSyncButton;
    private JPanel confluenceServersPanel;
    private JPanel serverListPanel;
    private JScrollPane scrollPane1;
    private JTable serverTable;
    private JPanel serverInfoFormPanel;
    private JLabel serverAliasLabel;
    private JTextField serverAliasField;
    private JLabel label6;
    private JLabel urlLabel;
    private JTextField urlField;
    private JLabel label2;
    private JLabel loginLabel;
    private JTextField loginField;
    private JLabel passwordLabel;
    private JPasswordField passwordField;
    private JLabel label9;
    private JPanel panel8;
    private JButton removeServerButton;
    private JButton serverTestConnectionButton;
    private JButton addServerButton;
    private JPanel spacesPanel;
    private JLabel label1;
    private JLabel remoteServerListPanel;
    private JLabel spacesToSyncListLabel;
    private JLabel localServerSelectLabel;
    private JScrollPane scrollPane2;
    private JList remoteServerList;
    private JLabel arrowLabel;
    private JScrollPane scrollPane3;
    private JList spacesToSyncList;
    private JLabel arrowLabel2;
    private JComboBox localServerComboBox;
    private JButton spaceRefreshButton;
    private JButton saveSyncButton;
    private JLabel selectedSyncLabel;
    private JScrollPane scrollPane4;
    private JList selectedSyncsList;
    private JPanel panel1;
    private JPanel panel2;
    private JLabel pageCopyLabel1;
    private JLabel pageCopyLabel2;
    private JComboBox pageCopyLocalServerComboBox;
    private JLabel pageCopyLabel3;
    private JComboBox pageCopyRemoteServerComboBox;
    private JPanel panel4;
    private JScrollPane scrollPane8;
    private JTree pageCopyJTree;
    private JPanel panel3;
    private JButton pageCopyRefreshTreeButton;
    private JPanel panel5;
    private JButton pageCopySendPagesButton2;
    private JButton pageCopySendPagesAndAttachmentsButton;
    private JScrollPane scrollPane9;
    private JTextArea pageCopySelectedListTextArea;
    private JPanel historyPanel;
    private JLabel syncHistoryLabel;
    private JScrollPane scrollPane5;
    private JList syncHistoryList;
    private JLabel syncHistoryDetailsLabel;
    private JScrollPane scrollPane6;
    private JTextArea textArea1;
    // JFormDesigner - End of variables declaration  //GEN-END:variables
}