package tim.prune.function.compress; import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.JCheckBox; import javax.swing.JPanel; import tim.prune.I18nManager; import tim.prune.data.Track; /** * Abstract class to act as an algorithm for track compression */ public abstract class CompressionAlgorithm { protected JCheckBox _activateCheckBox = null; protected SummaryLabel _summaryLabel = null; protected Track _track = null; protected TrackDetails _trackDetails = null; /** * Constructor giving Track * @param inTrack track object to use for compression * @param inDetails track details object * @param inListener listener to be informed of activation clicks */ public CompressionAlgorithm(Track inTrack, TrackDetails inDetails, ActionListener inListener) { _track = inTrack; _trackDetails = inDetails; _activateCheckBox = new JCheckBox(I18nManager.getText(getTitleTextKey())); _activateCheckBox.setSelected(false); _activateCheckBox.addActionListener(inListener); } /** * @return true if this algorithm has been activated */ public boolean isActivated() { return _activateCheckBox.isSelected(); } /** * @return JPanel containing gui components */ public JPanel getGuiComponents() { JPanel panel = new JPanel(); panel.setBorder(BorderFactory.createTitledBorder("")); panel.setLayout(new BorderLayout()); panel.add(_activateCheckBox, BorderLayout.NORTH); Component specifics = getSpecificGuiComponents(); if (specifics != null) { panel.add(specifics, BorderLayout.CENTER); } // Add label at bottom _summaryLabel = new SummaryLabel(_track); panel.add(_summaryLabel, BorderLayout.SOUTH); return panel; } /** * Preview the algorithm by counting the number of points deleted * @param inFlags array of deletion flags from previous algorithms * @return number of points to be deleted by this algorithm */ public int preview(boolean[] inFlags) { int numDeleted = 0; if (isActivated()) { // Run the compression and set the deletion flags _trackDetails.initialise(); numDeleted = compress(inFlags); _summaryLabel.setValue(numDeleted); } else { _summaryLabel.clearValue(); } return numDeleted; } /** * @return key to use for title text of algorithm */ protected abstract String getTitleTextKey(); /** * @return gui components controlling algorithm (if any) */ protected abstract Component getSpecificGuiComponents(); /** * Perform the compression and set the results in the given array * @param inFlags deletion flags from previous algorithms * @return number of points deleted by this algorithm */ protected abstract int compress(boolean[] inFlags); }