void selectGroup() {
   ExhibitGroup group = peer.getLoader().getGroup(groupNameList.getSelectedValue().toString());
   groupExhibitsModel.notifyChange();
   groupExhibitsList.setSelectionInterval(0, 0);
   groupXSpinnerModel.setValue(group.xPos);
   groupYSpinnerModel.setValue(group.yPos);
 }
  public void init() {
    exhibitNameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    exhibitNameList.setModel(exhibitNameModel);
    exhibitNameList.addListSelectionListener(
        new ListSelectionListener() {
          @Override
          public void valueChanged(ListSelectionEvent arg0) {
            selectExhibit();
          }
        });

    contentList.setModel(contentListModel);
    contentList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    contentList.addListSelectionListener(
        new ListSelectionListener() {
          @Override
          public void valueChanged(ListSelectionEvent arg0) {
            selectContent();
          }
        });

    groupExhibitsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    groupExhibitsList.setModel(groupExhibitsModel);

    exhibitAliasesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    exhibitAliasesList.setModel(exhibitAliasesModel);
    exhibitAliasesList.addListSelectionListener(
        new ListSelectionListener() {
          @Override
          public void valueChanged(ListSelectionEvent arg0) {
            selectAlias();
          }
        });

    groupNameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    groupNameList.setModel(groupListModel);
    groupNameList.addListSelectionListener(
        new ListSelectionListener() {
          @Override
          public void valueChanged(ListSelectionEvent arg0) {
            selectGroup();
          }
        });

    eventsList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    eventsList.setModel(eventsListModel);
    eventsList.addListSelectionListener(
        new ListSelectionListener() {
          @Override
          public void valueChanged(ListSelectionEvent arg0) {
            Event e = eventsListModel.getEvent(eventsList.getSelectedIndex());
            eventDescription.setText(e.getDescription());
            eventName.setText(e.getTitle());
            eventStart.getModel().setValue(e.getStartDay());
            eventEnd.getModel().setValue(e.getEndDay());
            eventPhotoDropdown.setSelectedItem(e.getImage());
          }
        });

    exhibitNextDropdown.setModel(new ExhibitDropdownModel());
    exhibitPreviousDropdown.setModel(new ExhibitDropdownModel());

    htmlContentViewer.setEditable(false);
    htmlContentViewer.setEditorKit(htmlKit);
    Document doc = htmlKit.createDefaultDocument();
    htmlContentViewer.setDocument(doc);

    eventName
        .getDocument()
        .addDocumentListener(
            new DocumentListener() {
              private void change() {
                Event e = peer.getLoader().getEvents().get(eventsList.getSelectedIndex());
                e.setTitle(eventName.getText());
                peer.makeChange();
                eventsListModel.notifyChange();
              }

              @Override
              public void changedUpdate(DocumentEvent arg0) {
                change();
              }

              @Override
              public void insertUpdate(DocumentEvent arg0) {
                change();
              }

              @Override
              public void removeUpdate(DocumentEvent arg0) {
                change();
              }
            });

    eventDescription.setLineWrap(true);
    eventDescription.setWrapStyleWord(true);
    eventDescription
        .getDocument()
        .addDocumentListener(
            new DocumentListener() {
              private void change() {
                Event e = peer.getLoader().getEvents().get(eventsList.getSelectedIndex());
                e.setDescription(eventDescription.getText());
                peer.makeChange();
              }

              @Override
              public void changedUpdate(DocumentEvent arg0) {
                change();
              }

              @Override
              public void insertUpdate(DocumentEvent arg0) {
                change();
              }

              @Override
              public void removeUpdate(DocumentEvent arg0) {
                change();
              }
            });

    photoCaption.setBorder(paddedLine);
    photoCaption.setLineWrap(true);
    photoCaption.setWrapStyleWord(true);
    photoCaption
        .getDocument()
        .addDocumentListener(
            new DocumentListener() {
              private void change() {
                getCurrentExhibit()
                    .getPhotos()[exhibitPhotosList.getSelectedIndex()]
                    .setCaption(photoCaption.getText());
                peer.makeChange();
              }

              @Override
              public void changedUpdate(DocumentEvent arg0) {
                change();
              }

              @Override
              public void insertUpdate(DocumentEvent arg0) {
                change();
              }

              @Override
              public void removeUpdate(DocumentEvent arg0) {
                change();
              }
            });

    exhibitNextDropdown.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            setNext();
          }
        });

    exhibitPreviousDropdown.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            setPrevious();
          }
        });

    addGroupExhibitButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent a) {
            addGroupExhibit();
          }
        });

    removeGroupExhibitButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            removeGroupExhibit();
          }
        });

    addGroupButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            addGroup();
          }
        });

    editFileButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent a) {
            editFile();
          }
        });

    viewFileButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent a) {
            viewFile();
          }
        });

    removeGroupButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent e) {
            removeGroup();
          }
        });

    newFileButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent arg0) {
            peer.addFile();
            modifiedFilesListModel.notifyChange();
          }
        });

    newExhibitButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent arg0) {
            addExhibit();
          }
        });

    removeExhibitButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent arg0) {
            removeExhibit();
          }
        });

    newTagButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent arg0) {
            addContent();
          }
        });

    removeTagButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent arg0) {
            removeTag();
          }
        });

    newImageButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent arg0) {
            addImage();
          }
        });

    addEventButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent arg0) {
            Event e = new Event();
            e.setTitle("New Event");
            e.setStartDay(new Date());
            peer.getLoader().getEvents().add(e);
            peer.getLoader().getEvents();
            eventsListModel.notifyChange();
            peer.makeChange();
            eventsList.setSelectedIndex(0);
          }
        });

    removeEventButton.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent arg0) {
            peer.getLoader().getEvents().remove(eventsList.getSelectedIndex());
            peer.getLoader().getEvents();
            eventsListModel.notifyChange();
            peer.makeChange();
          }
        });

    exhibitXSpinnerModel.addChangeListener(this);
    exhibitYSpinnerModel.addChangeListener(this);

    aliasXSpinnerModel.addChangeListener(this);
    aliasYSpinnerModel.addChangeListener(this);

    groupXSpinnerModel.addChangeListener(this);
    groupYSpinnerModel.addChangeListener(this);

    eventStart.getModel().addChangeListener(this);
    eventEnd.getModel().addChangeListener(this);

    eventPhotoDropdown.setEditable(false);
    eventPhotoDropdown.setModel(new PhotoDropdownModel());
    eventPhotoDropdown.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent arg0) {
            Event e = peer.getLoader().getEvents().get(eventsList.getSelectedIndex());
            e.setImage(eventPhotoDropdown.getSelectedItem().toString());
          }
        });

    newContentDropdown.setEditable(false);
    newContentDropdown.setModel(new ContentDropdownModel());
    newContentDropdown.addActionListener(
        new ActionListener() {
          @Override
          public void actionPerformed(ActionEvent arg0) {
            ExhibitInfo e = getCurrentExhibit();
            String currentTag = (String) contentList.getSelectedValue();
            String content = (String) newContentDropdown.getSelectedItem();
            e.setContent(currentTag, content);
            loadHTMLContent(content);
            if (false == e.getContent(currentTag).equals(e.getOrigContents(currentTag))) {
              peer.makeChange();
            }
          }
        });

    exhibitPhotosList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    exhibitPhotosList.setModel(exhibitPhotosModel);
    exhibitPhotosList.addListSelectionListener(
        new ListSelectionListener() {
          @Override
          public void valueChanged(ListSelectionEvent arg0) {
            selectPhoto();
          }
        });

    exhibitContentLabel.setBorder(paddedLine);

    modifiedFilesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    modifiedFilesList.setModel(modifiedFilesListModel);

    originalFilesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    originalFilesList.setModel(originalFilesListModel);

    modifiedFilesList.setSelectionInterval(0, 0);
    exhibitNameList.setSelectionInterval(0, 0);
    contentList.setSelectionInterval(0, 0);
    exhibitPhotosList.setSelectionInterval(0, 0);
    groupNameList.setSelectionInterval(0, 0);
    exhibitAliasesList.setSelectionInterval(0, 0);
    eventsList.setSelectionInterval(0, 0);

    JPanel contentDropdownPanel = new JPanel(new GridLayout(4, 1, 2, 2));
    contentDropdownPanel.add(new JLabel("Original content:"));
    contentDropdownPanel.add(exhibitContentLabel);
    contentDropdownPanel.add(new JLabel("Current content:"));
    contentDropdownPanel.add(newContentDropdown);

    JPanel contentButtonPanel = new JPanel(new GridLayout(3, 1, 2, 2));
    contentButtonPanel.add(newTagButton);
    contentButtonPanel.add(removeTagButton);
    contentButtonPanel.add(renameTagButton);

    for (Component c : contentButtonPanel.getComponents()) {
      JButton b = (JButton) c;
      b.setBorder(BorderFactory.createCompoundBorder(b.getBorder(), mediumPaddedBorder));
    }

    addEventButton.setBorder(largePaddedBorder);
    removeEventButton.setBorder(largePaddedBorder);

    JPanel contentListPanel = new JPanel(new BorderLayout());
    contentListPanel.add(new JScrollPane(contentList), BorderLayout.CENTER);
    contentListPanel.add(contentButtonPanel, BorderLayout.EAST);

    JPanel contentControlPanel = new JPanel(new GridLayout(2, 1, 2, 2));
    contentControlPanel.add(contentListPanel);
    contentControlPanel.add(contentDropdownPanel);

    contentPanel.add(new JScrollPane(htmlContentViewer));
    contentPanel.add(contentControlPanel);
    contentPanel.setBorder(mediumPaddedBorder);

    exhibitDataPanel.add(exhibitXCoordOrig);
    exhibitDataPanel.add(exhibitXCoordField);
    exhibitDataPanel.add(exhibitPreviousOrig);
    exhibitDataPanel.add(exhibitPreviousDropdown);
    exhibitDataPanel.add(exhibitYCoordOrig);
    exhibitDataPanel.add(exhibitYCoordField);
    exhibitDataPanel.add(exhibitNextOrig);
    exhibitDataPanel.add(exhibitNextDropdown);

    JPanel exhibitButtonsPanel = new JPanel(new GridLayout(3, 1, 2, 2));
    exhibitButtonsPanel.add(newExhibitButton);
    exhibitButtonsPanel.add(removeExhibitButton);
    exhibitButtonsPanel.add(renameExhibitButton);

    for (Component c : exhibitButtonsPanel.getComponents()) {
      JButton b = (JButton) c;
      b.setBorder(BorderFactory.createCompoundBorder(b.getBorder(), mediumPaddedBorder));
    }

    JPanel listPanelTop = new JPanel(new BorderLayout());
    listPanelTop.add(new JLabel("Exhibits:"), BorderLayout.NORTH);
    listPanelTop.add(new JScrollPane(exhibitNameList), BorderLayout.CENTER);
    listPanelTop.add(exhibitButtonsPanel, BorderLayout.EAST);

    JPanel photoButtonPanel = new JPanel(new GridLayout(1, 2, 2, 2));
    photoButtonPanel.add(newImageButton);
    photoButtonPanel.add(removeImageButton);

    JPanel photoDataPanel = new JPanel(new GridLayout(2, 1, 2, 2));
    photoDataPanel.add(new JScrollPane(exhibitPhotosList));
    photoDataPanel.add(photoCaption);

    JPanel photoPanelRight = new JPanel(new BorderLayout());
    photoPanelRight.add(new JLabel("Exhibit Photos:"), BorderLayout.NORTH);
    photoPanelRight.add(photoDataPanel, BorderLayout.CENTER);
    photoPanelRight.add(photoButtonPanel, BorderLayout.SOUTH);

    JPanel aliasPanel = new JPanel(new GridLayout(1, 3, 2, 2));
    aliasDataPanel.add(new JLabel("Alias X Coordinate"));
    aliasDataPanel.add(aliasXCoordField);
    aliasDataPanel.add(new JLabel("Alias Y Coordinate"));
    aliasDataPanel.add(aliasYCoordField);

    JPanel aliasDataLabeled = new JPanel(new BorderLayout());
    aliasDataLabeled.add(new JLabel("Exhibit Aliases:"), BorderLayout.NORTH);
    aliasDataLabeled.add(new JScrollPane(exhibitAliasesList), BorderLayout.CENTER);

    JPanel aliasButtonsPanel = new JPanel(new GridLayout(2, 1, 2, 2));
    aliasButtonsPanel.add(addAliasButton);
    aliasButtonsPanel.add(removeAliasButton);

    aliasPanel.add(aliasDataLabeled);
    aliasPanel.add(aliasDataPanel);
    aliasPanel.add(aliasButtonsPanel);
    aliasPanel.setBorder(paddedLine);

    JPanel groupXCoordPanel = new JPanel(new GridLayout(1, 2, 2, 2));
    groupXCoordPanel.add(new JLabel("Group X Coordinate"));
    groupXCoordPanel.add(groupXCoordField);

    JPanel groupYCoordPanel = new JPanel(new GridLayout(1, 2, 2, 2));
    groupYCoordPanel.add(new JLabel("Group Y Coordinate"));
    groupYCoordPanel.add(groupYCoordField);

    JPanel groupDataButtonsPanel = new JPanel(new GridLayout(4, 1, 2, 2));
    groupDataButtonsPanel.add(addGroupButton);
    groupDataButtonsPanel.add(removeGroupButton);
    groupDataButtonsPanel.add(addGroupExhibitButton);
    groupDataButtonsPanel.add(removeGroupExhibitButton);

    JPanel groupLocationPanel = new JPanel(new GridLayout(2, 1, 2, 2));
    groupLocationPanel.add(groupXCoordPanel);
    groupLocationPanel.add(groupYCoordPanel);
    groupLocationPanel.setBorder(paddedLine);

    JPanel groupDataPanel = new JPanel(new GridLayout(1, 2, 2, 2));
    groupDataPanel.add(groupLocationPanel);
    groupDataPanel.add(groupDataButtonsPanel);

    JPanel combinedDataPanel = new JPanel(new GridLayout(2, 1, 2, 2));
    combinedDataPanel.add(exhibitDataPanel);
    combinedDataPanel.add(aliasPanel);
    combinedDataPanel.setBorder(mediumPaddedBorder);

    photosPanel.add(new JScrollPane(exhibitPhotosImage));
    photosPanel.add(photoPanelRight);
    photosPanel.setBorder(mediumPaddedBorder);

    exhibitTabs.add("Exhibit Content", contentPanel);
    exhibitTabs.add("Exhibit Photos", photosPanel);
    exhibitTabs.add("Exhibit Properties", combinedDataPanel);

    mainPanel.add(listPanelTop, BorderLayout.NORTH);
    mainPanel.add(exhibitTabs, BorderLayout.CENTER);

    mainPanel.setBorder(mediumPaddedBorder);

    groupListPanel.add(new JScrollPane(groupNameList));
    groupListPanel.add(new JScrollPane(groupExhibitsList));

    JPanel fileButtonPanel = new JPanel(new GridLayout(2, 1, 2, 2));
    fileButtonPanel.add(newFileButton);
    fileButtonPanel.add(editFileButton);

    for (Component c : fileButtonPanel.getComponents()) {
      JButton b = (JButton) c;
      b.setBorder(BorderFactory.createCompoundBorder(b.getBorder(), largePaddedBorder));
    }

    JPanel originalListPanel = new JPanel(new BorderLayout());
    originalListPanel.add(new JLabel("Original Files:"), BorderLayout.NORTH);
    originalListPanel.add(new JScrollPane(originalFilesList), BorderLayout.CENTER);
    originalListPanel.add(viewFileButton, BorderLayout.EAST);

    JPanel modifiedListPanel = new JPanel(new BorderLayout());
    modifiedListPanel.add(new JLabel("Added Files:"), BorderLayout.NORTH);
    modifiedListPanel.add(new JScrollPane(modifiedFilesList), BorderLayout.CENTER);
    modifiedListPanel.add(fileButtonPanel, BorderLayout.EAST);

    JPanel eventImagePanel = new JPanel(new BorderLayout());
    eventImagePanel.add(new JLabel("Event Image: "), BorderLayout.WEST);
    eventImagePanel.add(eventPhotoDropdown, BorderLayout.CENTER);

    JPanel eventTimePanel = new JPanel(new GridLayout(1, 4, 2, 2));
    eventTimePanel.add(new JLabel("Start Date:"));
    eventTimePanel.add(eventStart);
    eventTimePanel.add(new JLabel("End Date:"));
    eventTimePanel.add(eventEnd);

    JPanel eventsSmallDataPanel = new JPanel(new GridLayout(2, 1, 2, 2));
    eventsSmallDataPanel.add(eventTimePanel);
    eventsSmallDataPanel.add(eventImagePanel);

    JPanel eventsDataPanel = new JPanel(new BorderLayout());
    eventsDataPanel.add(eventName, BorderLayout.NORTH);
    eventsDataPanel.add(new JScrollPane(eventDescription), BorderLayout.CENTER);
    eventsDataPanel.add(eventsSmallDataPanel, BorderLayout.SOUTH);

    JPanel eventButtonsPanel = new JPanel(new GridLayout(1, 2, 2, 2));
    eventButtonsPanel.add(addEventButton);
    eventButtonsPanel.add(removeEventButton);

    JPanel eventsListPanel = new JPanel(new BorderLayout());
    eventsListPanel.add(new JScrollPane(eventsList), BorderLayout.CENTER);
    eventsListPanel.add(eventButtonsPanel, BorderLayout.SOUTH);

    JPanel eventsPanel = new JPanel(new GridLayout(2, 1, 2, 2));
    eventsPanel.add(eventsListPanel);
    eventsPanel.add(eventsDataPanel);

    filePanel.add(originalListPanel);
    filePanel.add(modifiedListPanel);

    groupPanel.add(groupListPanel);
    groupPanel.add(groupDataPanel);
    groupPanel.setBorder(mediumPaddedBorder);

    tabbedPane.setBorder(thinPaddedBorder);

    tabbedPane.addTab("Exhibits", mainPanel);
    tabbedPane.addTab("Groups", groupPanel);
    tabbedPane.addTab("Map", mapPanel);
    tabbedPane.addTab("Files", filePanel);
    tabbedPane.addTab("Events", eventsPanel);
  }