public void renameFlameBtn_clicked() {
    try {
      Flame flame = poolFlameHolder.getFlame();
      if (flame != null) {
        int idx = flamePropertiesTree.getSelectionRows()[0];
        String s =
            StandardDialogs.promptForText(
                rootTabbedPane, "Please enter the new title:", flame.getName());
        if (s != null) {
          for (Flame tFlame : project.getFlames()) {
            if (!tFlame.isEqual(flame) && s.equals(tFlame.getName())) {
              throw new RuntimeException(
                  "A different flame with the name \"" + s + "\" alread exists");
            }
          }
          flame.setName(s);
          refreshProjectFlames();
          if (project.getFlames().size() == 0) {
            flamePropertiesTree_changed(null);
          } else {
            try {
              flamePropertiesTree.setSelectionRow(idx);
            } catch (Exception ex) {

            }
          }
          enableControls();
        }
      }
    } catch (Exception ex) {
      errorHandler.handleError(ex);
    }
  }
  public void replaceFlameFromEditorBtn_clicked(Flame pFlame) {
    if (pFlame != null) {
      Flame flame = poolFlameHolder.getFlame();
      if (flame != null) {
        int idx = flamePropertiesTree.getSelectionRows()[0];
        // cant remove the flame by object reference because its a clone
        Flame newFlame = validateDancingFlame(pFlame.makeCopy());
        Flame oldFlame = project.getFlames().get(idx);
        for (Motion motion : project.getMotions()) {
          for (MotionLink link : motion.getMotionLinks()) {
            if (link.getProperyPath().getFlame().isEqual(oldFlame)) {
              link.getProperyPath().setFlame(newFlame);
            }
          }
        }

        project.getFlames().set(idx, newFlame);
        refreshProjectFlames();
        if (project.getFlames().size() == 0) {
          flamePropertiesTree_changed(null);
        } else {
          try {
            flamePropertiesTree.setSelectionRow(idx);
          } catch (Exception ex) {

          }
        }
        enableControls();
      }
    }
  }
 public void deleteFlameBtn_clicked() {
   Flame flame = poolFlameHolder.getFlame();
   if (flame != null) {
     int idx = flamePropertiesTree.getSelectionRows()[0];
     // cant remove the flame by object reference because its a clone
     project.getFlames().remove(idx);
     refreshProjectFlames();
     if (project.getFlames().size() == 0) {
       flamePropertiesTree_changed(null);
     }
     enableControls();
   }
 }
  private void enableControls() {
    loadSoundBtn.setEnabled(!running);
    addFromClipboardBtn.setEnabled(!running);
    addFromEditorBtn.setEnabled(!running);
    addFromDiscBtn.setEnabled(!running);
    randomCountIEd.setEnabled(!running);
    genRandFlamesBtn.setEnabled(!running);
    randomGenCmb.setEnabled(!running);
    boolean flameSelected = poolFlameHolder.getFlame() != null;
    flameToEditorBtn.setEnabled(flameSelected);
    deleteFlameBtn.setEnabled(flameSelected);
    renameFlameBtn.setEnabled(flameSelected);
    replaceFlameFromEditorBtn.setEnabled(flameSelected);

    framesPerSecondIEd.setEnabled(!running);
    borderSizeSlider.setEnabled(true);
    morphFrameCountIEd.setEnabled(true);
    startShowButton.setEnabled(!running && project.getFlames().size() > 0);
    stopShowButton.setEnabled(running);
    doRecordCBx.setEnabled(!running);

    motionTable.setEnabled(!running);
    addMotionCmb.setEnabled(!running);
    addMotionBtn.setEnabled(!running);
    Motion selMotion = getSelectedMotion();

    deleteMotionBtn.setEnabled(!running && selMotion != null);
    renameMotionBtn.setEnabled(deleteMotionBtn.isEnabled());
    boolean plainPropertySelected =
        flamePropertiesTreeService.isPlainPropertySelected(flamePropertiesTree);
    {
      boolean linkMotionEnabled = false;
      if (!running && selMotion != null && selMotion.getParent() == null) {
        if (plainPropertySelected) {
          FlamePropertyPath selPath =
              flamePropertiesTreeService.getSelectedPropertyPath(flamePropertiesTree);
          linkMotionEnabled = !selMotion.hasLink(selPath);
        }
      }
      linkMotionBtn.setEnabled(linkMotionEnabled);
      unlinkMotionBtn.setEnabled(
          selMotion != null
              && motionLinksTable.getSelectedRow() >= 0
              && motionLinksTable.getSelectedRow() < selMotion.getMotionLinks().size());
    }

    createMotionsCmb.setEnabled(!running);
    clearMotionsBtn.setEnabled(!running && project.getMotions().size() > 0);
    loadProjectBtn.setEnabled(!running);
    saveProjectBtn.setEnabled(!running);
  }
 public void startShow() {
   try {
     if (project.getFlames().size() == 0) throw new Exception("No flames to animate");
     jLayer.stop();
     if (project.getSoundFilename() != null && project.getSoundFilename().length() > 0) {
       jLayer.play(project.getSoundFilename());
     }
     startRender();
     running = true;
     enableControls();
   } catch (Throwable ex) {
     errorHandler.handleError(ex);
   }
 }
 public void deleteMotionBtn_clicked() {
   int row = motionTable.getSelectedRow();
   if (row >= 0 && row < project.getMotions().size()) {
     project.getMotions().remove(row);
     refreshMotionTable();
     if (row >= project.getMotions().size()) {
       row--;
     }
     if (row >= 0) {
       motionTable.getSelectionModel().setSelectionInterval(row, row);
     }
     motionTableClicked();
     enableControls();
   }
 }
 public void loadFlameButton_clicked() {
   try {
     JFileChooser chooser = new FlameFileChooser(prefs);
     if (prefs.getInputFlamePath() != null) {
       try {
         chooser.setCurrentDirectory(new File(prefs.getInputFlamePath()));
       } catch (Exception ex) {
         ex.printStackTrace();
       }
     }
     chooser.setMultiSelectionEnabled(true);
     if (chooser.showOpenDialog(poolFlamePreviewPnl) == JFileChooser.APPROVE_OPTION) {
       for (File file : chooser.getSelectedFiles()) {
         List<Flame> newFlames = new FlameReader(prefs).readFlames(file.getAbsolutePath());
         prefs.setLastInputFlameFile(file);
         if (newFlames != null && newFlames.size() > 0) {
           for (Flame newFlame : newFlames) {
             project.getFlames().add(validateDancingFlame(newFlame));
           }
         }
       }
       refreshProjectFlames();
       enableControls();
     }
   } catch (Throwable ex) {
     errorHandler.handleError(ex);
   }
 }
  public void genRandomFlames() {
    try {
      final int IMG_WIDTH = 80;
      final int IMG_HEIGHT = 60;
      int count = (int) ((Double) randomCountIEd.getValue() + 0.5);
      for (int i = 0; i < count; i++) {

        RandomFlameGenerator randGen =
            RandomFlameGeneratorList.getRandomFlameGeneratorInstance(
                (String) randomGenCmb.getSelectedItem(), true);
        int palettePoints = 3 + (int) (Math.random() * 68.0);
        boolean fadePaletteColors = Math.random() > 0.33;
        RandomFlameGeneratorSampler sampler =
            new RandomFlameGeneratorSampler(
                IMG_WIDTH,
                IMG_HEIGHT,
                prefs,
                randGen,
                RandomSymmetryGeneratorList.NONE,
                RandomGradientGeneratorList.DEFAULT,
                palettePoints,
                fadePaletteColors,
                RandomBatchQuality.NORMAL);
        project.getFlames().add(validateDancingFlame(sampler.createSample().getFlame()));
      }
      refreshProjectFlames();
      enableControls();
    } catch (Throwable ex) {
      errorHandler.handleError(ex);
    }
  }
 public void stopRender() throws Exception {
   if (renderThread != null) {
     if (doRecordCBx.isSelected()) {
       actionRecorder.recordStop();
     }
     renderThread.setForceAbort(true);
     if (doRecordCBx.isSelected()) {
       JFileChooser chooser = new FlameFileChooser(prefs);
       if (prefs.getOutputFlamePath() != null) {
         try {
           chooser.setCurrentDirectory(new File(prefs.getOutputFlamePath()));
         } catch (Exception ex) {
           ex.printStackTrace();
         }
       }
       if (chooser.showSaveDialog(flameRootPanel) == JFileChooser.APPROVE_OPTION) {
         File file = chooser.getSelectedFile();
         prefs.setLastOutputFlameFile(file);
         PostRecordFlameGenerator generator =
             new PostRecordFlameGenerator(
                 Prefs.getPrefs(), project, actionRecorder, renderThread, project.getFFT());
         generator.createRecordedFlameFiles(file.getAbsolutePath());
       }
     }
     renderThread = null;
     actionRecorder = null;
   }
 }
 public void importFlame(Flame pFlame) {
   if (pFlame != null) {
     project.getFlames().add(validateDancingFlame(pFlame.makeCopy()));
     refreshProjectFlames();
     enableControls();
   }
 }
 public void flameCmb_changed() {
   if (!refreshing && renderThread != null) {
     Flame selFlame =
         flamesCmb.getSelectedIndex() >= 0
                 && flamesCmb.getSelectedIndex() < project.getFlames().size()
             ? project.getFlames().get(flamesCmb.getSelectedIndex())
             : null;
     if (selFlame != null && renderThread != null) {
       int morphFrameCount = Integer.parseInt(morphFrameCountIEd.getText());
       renderThread
           .getFlameStack()
           .addFlame(selFlame, morphFrameCount, project.getMotions(selFlame));
       if (actionRecorder != null) actionRecorder.recordFlameChange(selFlame, morphFrameCount);
     }
   }
 }
 private void refreshFlamesCmb() {
   Flame selFlame =
       flamesCmb.getSelectedIndex() >= 0
               && flamesCmb.getSelectedIndex() < project.getFlames().size()
           ? project.getFlames().get(flamesCmb.getSelectedIndex())
           : null;
   int newSelIdx = -1;
   flamesCmb.removeAllItems();
   for (int i = 0; i < project.getFlames().size(); i++) {
     Flame flame = project.getFlames().get(i);
     if (newSelIdx < 0 && flame.equals(selFlame)) {
       newSelIdx = i;
     }
     flamesCmb.addItem(flamePropertiesTreeService.getFlameCaption(flame));
   }
   flamesCmb.setSelectedIndex(
       newSelIdx >= 0 ? newSelIdx : project.getFlames().size() > 0 ? 0 : -1);
 }
  public void motionTableClicked() {
    if (!refreshing) {
      if (motionPropertyPnl != null) {
        motionPropertyRootPnl.remove(motionPropertyPnl);
        motionPropertyPnl = null;
      }
      if (project.getMotions().size() > 0
          && motionTable.getSelectedRow() >= 0
          && motionTable.getSelectedRow() < project.getMotions().size()) {
        Motion motion = project.getMotions().get(motionTable.getSelectedRow());

        @SuppressWarnings("rawtypes")
        Map<Class, PropertyEditor> editors = new HashMap<Class, PropertyEditor>();
        editors.put(Motion.class, new MotionTypeEditor(project.getMotions()));

        motionPropertyPnl = new PropertyPanel(motion, editors);

        motionPropertyPnl.setDescriptionVisible(false);

        PropertyChangeListener listener =
            new PropertyChangeListener() {
              public void propertyChange(PropertyChangeEvent evt) {
                refreshing = true;
                try {
                  int oldSel = motionTable.getSelectedRow();
                  refreshMotionTable();
                  motionTable.getSelectionModel().setSelectionInterval(oldSel, oldSel);
                  enableControls();
                } finally {
                  refreshing = false;
                }
              }
            };
        motionPropertyPnl.addPropertySheetChangeListener(listener);

        motionPropertyRootPnl.add(motionPropertyPnl, BorderLayout.CENTER);
        enableControls();
      }
    }
    refreshMotionLinksTable();
    motionPropertyRootPnl.invalidate();
    motionPropertyRootPnl.validate();
  }
 public void startRender() throws Exception {
   stopRender();
   Flame selFlame =
       flamesCmb.getSelectedIndex() >= 0
               && flamesCmb.getSelectedIndex() < project.getFlames().size()
           ? project.getFlames().get(flamesCmb.getSelectedIndex())
           : null;
   renderThread = new RealtimeAnimRenderThread(this, project);
   renderThread.getFlameStack().addFlame(selFlame, 0, project.getMotions(selFlame));
   actionRecorder = new ActionRecorder(renderThread);
   renderThread.setFFTData(project.getFFT());
   renderThread.setMusicPlayer(jLayer);
   renderThread.setFFTPanel(getGraph1Panel());
   renderThread.setFramesPerSecond(Integer.parseInt(framesPerSecondIEd.getText()));
   renderThread.setDrawTriangles(drawTrianglesCbx.isSelected());
   renderThread.setDrawFFT(drawFFTCbx.isSelected());
   renderThread.setDrawFPS(drawFPSCbx.isSelected());
   actionRecorder.recordStart(selFlame);
   new Thread(renderThread).start();
 }
 public void renameMotionBtn_clicked() {
   int row = motionTable.getSelectedRow();
   if (row >= 0 && row < project.getMotions().size()) {
     Motion motion = project.getMotions().get(row);
     String s =
         StandardDialogs.promptForText(
             rootTabbedPane, "Please enter the new title:", motion.getDisplayLabel());
     if (s != null) {
       motion.setCaption(s);
       refreshMotionTable();
       if (row >= project.getMotions().size()) {
         row--;
       }
       if (row >= 0) {
         motionTable.getSelectionModel().setSelectionInterval(row, row);
       }
       motionTableClicked();
       enableControls();
     }
   }
 }
  public void addMotionBtn_clicked() {
    try {
      MotionType motionType = (MotionType) addMotionCmb.getSelectedItem();
      if (motionType != null) {
        Motion newMotion = motionType.getMotionClass().newInstance();
        project.getMotions().add(newMotion);

        boolean oldRefreshing = refreshing;
        refreshing = true;
        try {
          refreshMotionTable();
        } finally {
          refreshing = oldRefreshing;
        }

        int selectRow = project.getMotions().size() - 1;
        motionTable.getSelectionModel().setSelectionInterval(selectRow, selectRow);
      }
    } catch (Throwable ex) {
      errorHandler.handleError(ex);
    }
  }
 public void loadSoundButton_clicked() {
   try {
     JFileChooser chooser = new SoundFileChooser(prefs);
     if (prefs.getInputSoundFilePath() != null) {
       try {
         chooser.setCurrentDirectory(new File(prefs.getInputSoundFilePath()));
       } catch (Exception ex) {
         ex.printStackTrace();
       }
     }
     if (chooser.showOpenDialog(flameRootPanel) == JFileChooser.APPROVE_OPTION) {
       File file = chooser.getSelectedFile();
       prefs.setLastInputSoundFile(file);
       project.setSoundFilename(jLayer, file.getAbsolutePath());
       enableControls();
     }
   } catch (Throwable ex) {
     errorHandler.handleError(ex);
   }
 }
 public void loadFlameFromClipboardButton_clicked() {
   List<Flame> newFlames = null;
   try {
     Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
     Transferable clipData = clipboard.getContents(clipboard);
     if (clipData != null) {
       if (clipData.isDataFlavorSupported(DataFlavor.stringFlavor)) {
         String xml = (String) (clipData.getTransferData(DataFlavor.stringFlavor));
         newFlames = new FlameReader(prefs).readFlamesfromXML(xml);
       }
     }
     if (newFlames == null || newFlames.size() < 1) {
       throw new Exception("There is currently no valid flame in the clipboard");
     } else {
       for (Flame newFlame : newFlames) {
         project.getFlames().add(validateDancingFlame(newFlame));
       }
       refreshProjectFlames();
       enableControls();
     }
   } catch (Throwable ex) {
     errorHandler.handleError(ex);
   }
 }
 public void clearMotionsBtn_clicked() {
   project.getMotions().clear();
   refreshMotionTable();
   motionTableClicked();
   enableControls();
 }
 private Motion getSelectedMotion() {
   return motionTable.getSelectedRow() >= 0
           && motionTable.getSelectedRow() < project.getMotions().size()
       ? project.getMotions().get(motionTable.getSelectedRow())
       : null;
 }