void addImage() {
    ArrayList<String> fileList = new ArrayList<String>();
    for (String file : peer.getOriginalFiles()) {
      if (false == peer.modifiedFileExists(file)) {
        if (ZipManager.isImage(file)) {
          fileList.add(file);
        }
      }
    }
    for (String file : peer.getModifiedFileNames()) {
      if (ZipManager.isImage(file)) {
        fileList.add(file);
      }
    }
    Object[] files = fileList.toArray();
    String s =
        (String)
            JOptionPane.showInputDialog(
                null,
                "File to use:",
                "New Photo",
                JOptionPane.PLAIN_MESSAGE,
                null,
                files,
                files[0]);

    if ((s != null) && (s.length() > 0)) {
      getCurrentExhibit().addPhoto(new ExhibitPhoto(s, null));
      exhibitPhotosModel.notifyChange();
      peer.makeChange();
    }
  }
 void removeExhibit() {
   if (exhibitNameList.getModel().getSize() > 1) {
     peer.getLoader().removeExhibit((String) exhibitNameList.getSelectedValue());
     exhibitNameList.setSelectionInterval(0, 0);
     peer.makeChange();
     exhibitNameModel.notifyChange();
   }
 }
 void removeGroup() {
   peer.makeChange();
   peer.getLoader().removeGroup(groupNameList.getSelectedValue().toString());
   groupNameList.setSelectionInterval(0, 0);
   groupExhibitsList.setSelectionInterval(0, 0);
   groupExhibitsModel.notifyChange();
   groupListModel.notifyChange();
 }
 void addGroup() {
   String newName = JOptionPane.showInputDialog("Name of new exhibit:");
   if (newName != null && newName.length() > 0) { // TODO add name expression matching
     peer.getLoader().addGroup(newName, new String[0], -1, -1);
     groupListModel.notifyChange();
     peer.makeChange();
   }
 }
 void editFile() {
   String[] keys = peer.getModifiedFileNames();
   File f = peer.getModifiedFile(keys[modifiedFilesList.getSelectedIndex()]);
   String[] exec = {"cmd.exe", "/C", f.getPath()};
   try {
     Runtime.getRuntime().exec(exec);
   } catch (IOException e) {
     e.printStackTrace();
   }
 }
 void addContent() {
   String newName = JOptionPane.showInputDialog("Name of new content:");
   if (newName != null && ZipManager.localPathPattern.matcher(newName).matches()) {
     getCurrentExhibit().setContent(newName, peer.getOriginalFiles()[0]);
     contentListModel.notifyChange();
     peer.makeChange();
   } else {
     System.out.println("Invalid tag name " + newName);
   }
 }
  void selectPhoto() {
    int index = exhibitPhotosList.getSelectedIndex();
    String shortUrl = getCurrentExhibit().getPhotos()[index].shortUrl;

    if (peer.modifiedFileExists(shortUrl)) {
      exhibitPhotosImage.setImage(peer.getModifiedFile(shortUrl));
    } else {
      exhibitPhotosImage.setImage(shortUrl, peer.getFileInputStream("assets/" + shortUrl));
    }
    photoCaption.setText(getCurrentExhibit().getPhotos()[index].getCaption());
  }
 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 ComponentHolder(ManagerInterface manager, Dimension mapDimension) {
    peer = manager;
    mapPanel = new JMapPanel(new GridLayout(1, 1, 2, 2), mapDimension, peer.getLoader());
    modifiedFilesListModel = new ModifiedListModel();
    originalFilesListModel = new OriginalFilesListModel();
    contentListModel = new ContentListModel();
    exhibitPhotosModel = new ExhibitPhotosModel();
    exhibitNameModel = new ExhibitListModel();
    groupListModel = new GroupListModel();
    groupExhibitsModel = new GroupExhibitsModel();
    exhibitAliasesModel = new ExhibitAliasesModel();
    eventsListModel = new EventsListModel();

    Calendar calendar = Calendar.getInstance();
    Date initDate = calendar.getTime();
    calendar.add(Calendar.YEAR, -100);
    Date earliestDate = calendar.getTime();
    calendar.add(Calendar.YEAR, 200);
    Date latestDate = calendar.getTime();
    SpinnerModel dateModel1 =
        new SpinnerDateModel(initDate, earliestDate, latestDate, Calendar.DATE);
    SpinnerModel dateModel2 =
        new SpinnerDateModel(initDate, earliestDate, latestDate, Calendar.DATE);
    eventStart = new JSpinner(dateModel1);
    eventEnd = new JSpinner(dateModel2);
    eventStart.setEditor(new JSpinner.DateEditor(eventStart, "MM/dd/yyyy"));
    eventEnd.setEditor(new JSpinner.DateEditor(eventEnd, "MM/dd/yyyy"));
  }
 private String[] getAllContentList() {
   ArrayList<String> list = new ArrayList<String>();
   for (String s : peer.getOriginalFiles()) {
     if (false == peer.modifiedFileExists(s)) {
       if (ZipManager.isImage(s) == false) {
         list.add(s);
       }
     }
   }
   for (String s : peer.getModifiedFileNames()) {
     if (ZipManager.isImage(s) == false) {
       list.add(s);
     }
   }
   return list.toArray(new String[0]);
 }
 void addExhibit() {
   String newName = JOptionPane.showInputDialog("Name of new exhibit:");
   if (newName != null && ZipManager.exhibitNamePattern.matcher(newName).matches()) {
     String newContentName = JOptionPane.showInputDialog("Name of first new content:");
     if (newContentName != null && ZipManager.localPathPattern.matcher(newContentName).matches()) {
       ExhibitInfo newE = new ExhibitInfo(newName, 0, 0, null, null);
       newE.setContent(newContentName, peer.getOriginalFiles()[0]);
       peer.getLoader().getExhibits().add(newE);
       exhibitNameModel.notifyChange();
       contentListModel.notifyChange();
       peer.makeChange();
     } else {
       System.out.println("Invalid tag name " + newContentName);
     }
   } else {
     System.out.println("Invalid exhibit name " + newName);
   }
 }
 void setPrevious() {
   String prev = (String) exhibitPreviousDropdown.getSelectedItem();
   if (prev != null) {
     ExhibitInfo e = getCurrentExhibit();
     e.setPrevious(prev);
     if (e.origPrevious == null || false == e.origPrevious.equals(prev)) {
       peer.makeChange();
     }
   }
 }
 void setNext() {
   String next = (String) exhibitNextDropdown.getSelectedItem();
   if (next != null) {
     ExhibitInfo e = getCurrentExhibit();
     e.setNext(next);
     if (e.origNext == null || false == e.origNext.equals(next)) {
       peer.makeChange();
     }
   }
 }
 void removeTag() {
   if (contentList.getModel().getSize() > 1) {
     for (ExhibitInfo e : peer.getLoader().getExhibits()) {
       if (e.getName().equals((String) exhibitNameList.getSelectedValue())) {
         e.setContent((String) contentList.getSelectedValue(), null);
       }
     }
   }
   contentListModel.notifyChange();
   contentList.setSelectionInterval(0, 0);
 }
 void viewFile() {
   String filename = peer.getOriginalFiles()[originalFilesList.getSelectedIndex()];
   String ext = filename.substring(filename.lastIndexOf('.') + 1);
   try {
     File f = new File(".tmp" + new Random().nextInt() + "." + ext);
     OutputStream outStream = new FileOutputStream(f);
     InputStream stream = peer.getFileInputStream("assets/" + filename);
     for (int result = stream.read(); result != -1; result = stream.read()) {
       outStream.write(result);
     }
     outStream.close();
     String[] exec = {"cmd.exe", "/C", f.getPath()};
     try {
       Runtime.getRuntime().exec(exec);
     } catch (IOException e) {
       e.printStackTrace();
     }
   } catch (IOException e) {
     e.printStackTrace();
   }
 }
  void addGroupExhibit() {
    ArrayList<ExhibitInfo> filesList = new ArrayList<ExhibitInfo>();
    for (ExhibitInfo e : peer.getLoader().getExhibits()) {
      filesList.add(e);
    }
    String groupName = groupNameList.getSelectedValue().toString();
    ExhibitGroup group = peer.getLoader().getGroup(groupName);

    for (String name : group.exhibits) {
      for (int i = 0; i < filesList.size(); i++) {
        if (filesList.get(i).getName().equals(name)) {
          filesList.remove(i);
        }
      }
    }
    Object[] files = filesList.toArray();

    ExhibitInfo e =
        (ExhibitInfo)
            JOptionPane.showInputDialog(
                null,
                "Exhibit:",
                "Add which exhibit to group?",
                JOptionPane.PLAIN_MESSAGE,
                null,
                files,
                files[0]);
    if (e != null) {
      String[] names = new String[group.exhibits.length + 1];
      for (int i = 0; i < names.length - 1; i++) {
        names[i] = group.exhibits[i];
      }
      names[names.length - 1] = e.getName();
      ExhibitGroup newGroup = new ExhibitGroup(names, -1, -1);
      peer.getLoader().addGroup(groupName, newGroup.exhibits, newGroup.xPos, newGroup.yPos);
      peer.makeChange();
      groupExhibitsModel.notifyChange();
    }
  }
 void loadHTMLContent(String shortUrl) {
   try {
     StyleSheet style = htmlKit.getStyleSheet();
     BufferedReader r =
         new BufferedReader(
             new InputStreamReader(
                 peer.getFileInputStream("assets/ExhibitContents/exhibits.css")));
     style.loadRules(r, null);
   } catch (Exception e) {
     // TODO do the try block differently if css has been modified.
   }
   InputStream r =
       peer.getFileInputStream("assets/" + shortUrl); // TODO do differently if modified
   StringBuffer sb = new StringBuffer(128);
   try {
     byte[] buffer = new byte[128];
     for (int result = r.read(buffer); result != -1; result = r.read(buffer)) {
       sb.append(new String(buffer, 0, result));
     }
   } catch (IOException e) {
   }
   htmlContentViewer.setText(sb.toString());
 }
 ExhibitInfo getCurrentExhibit() {
   String name = (String) exhibitNameList.getSelectedValue();
   int index = -1;
   ArrayList<ExhibitInfo> exhibitList = peer.getLoader().getExhibits();
   for (int i = 0; i < exhibitList.size(); i++) {
     if (exhibitList.get(i).getName().equals(name)) {
       index = i;
     }
   }
   if (index == -1) {
     return exhibitList.get(0);
   } else {
     return exhibitList.get(index);
   }
 }
 @Override
 public void stateChanged(ChangeEvent arg0) {
   ExhibitInfo e = getCurrentExhibit();
   if (arg0.getSource().equals(exhibitXCoordField.getModel())) {
     int val = Integer.parseInt(exhibitXCoordField.getModel().getValue().toString());
     e.setCoords(val, e.getY());
     if (e.origXCoord != e.getX()) {
       peer.makeChange();
     }
   } else if (arg0.getSource().equals(exhibitYCoordField.getModel())) {
     int val = Integer.parseInt(exhibitYCoordField.getModel().getValue().toString());
     e.setCoords(e.getX(), val);
     if (e.origYCoord != e.getY()) {
       peer.makeChange();
     }
   } else if (arg0.getSource().equals(aliasXCoordField.getModel())) {
     int val = Integer.parseInt(aliasXCoordField.getModel().getValue().toString());
     int index = exhibitAliasesList.getSelectedIndex();
     Alias alias = e.getAliases()[index];
     if (alias.xPos != val) {
       e.addAlias(alias.name, val, alias.yPos, alias.tag);
       peer.makeChange();
     }
   } else if (arg0.getSource().equals(aliasYCoordField.getModel())) {
     int val = Integer.parseInt(aliasYCoordField.getModel().getValue().toString());
     int index = exhibitAliasesList.getSelectedIndex();
     Alias alias = e.getAliases()[index];
     if (alias.yPos != val) {
       e.addAlias(alias.name, alias.xPos, val, alias.tag);
       peer.makeChange();
     }
   } else if (arg0.getSource().equals(groupXCoordField.getModel())) {
     int val = Integer.parseInt(groupXCoordField.getModel().getValue().toString());
     String name = groupNameList.getSelectedValue().toString();
     ExhibitGroup group = peer.getLoader().getGroup(name);
     if (val != group.xPos) {
       peer.getLoader().addGroup(name, group.exhibits, val, group.yPos);
       peer.makeChange();
     }
   } else if (arg0.getSource().equals(groupYCoordField.getModel())) {
     int val = Integer.parseInt(groupYCoordField.getModel().getValue().toString());
     String name = groupNameList.getSelectedValue().toString();
     ExhibitGroup group = peer.getLoader().getGroup(name);
     if (val != group.yPos) {
       peer.getLoader().addGroup(name, group.exhibits, group.xPos, val);
       peer.makeChange();
     }
   } else if (arg0.getSource().equals(eventStart.getModel())) {
     Event event = peer.getLoader().getEvents().get(eventsList.getSelectedIndex());
     event.setStartDay((Date) eventStart.getModel().getValue());
     peer.makeChange();
   } else if (arg0.getSource().equals(eventEnd.getModel())) {
     Event event = peer.getLoader().getEvents().get(eventsList.getSelectedIndex());
     event.setEndDay((Date) eventEnd.getModel().getValue());
     peer.makeChange();
   }
 }