Java tutorial
/* * Copyright 2004 - 2008 Christian Sprajc. All rights reserved. * * This file is part of PowerFolder. * * PowerFolder is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation. * * PowerFolder is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PowerFolder. If not, see <http://www.gnu.org/licenses/>. * * $Id: DownloadsInformationCard.java 5457 2008-10-17 14:25:41Z harry $ */ package de.dal33t.powerfolder.ui.information.downloads; import com.jgoodies.forms.builder.ButtonBarBuilder; import com.jgoodies.forms.builder.DefaultFormBuilder; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; import de.dal33t.powerfolder.ConfigurationEntry; import de.dal33t.powerfolder.Controller; import de.dal33t.powerfolder.Constants; import de.dal33t.powerfolder.disk.Folder; import de.dal33t.powerfolder.transfer.DownloadManager; import de.dal33t.powerfolder.light.FileInfo; import de.dal33t.powerfolder.ui.util.Icons; import de.dal33t.powerfolder.ui.util.DelayedUpdater; import de.dal33t.powerfolder.ui.action.BaseAction; import de.dal33t.powerfolder.ui.information.HasDetailsPanel; import de.dal33t.powerfolder.ui.information.InformationCard; import de.dal33t.powerfolder.ui.information.InformationCardType; import de.dal33t.powerfolder.ui.information.folder.files.FileDetailsPanel; import de.dal33t.powerfolder.ui.information.folder.files.versions.FileVersionsPanel; import de.dal33t.powerfolder.util.Translation; import de.dal33t.powerfolder.util.Format; import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.ActionEvent; import java.util.TimerTask; /** * Information card for a folder. Includes files, members and settings tabs. */ public class DownloadsInformationCard extends InformationCard implements HasDetailsPanel { private JPanel uiComponent; private JPanel toolBar; private DownloadsTablePanel tablePanel; private Action abortDownloadsAction; private Action openDownloadAction; private JPanel detailsPanel; private FileDetailsPanel fileDetailsPanel; private FileVersionsPanel fileVersionsPanel; private Action clearCompletedDownloadsAction; private JSlider cleanupSlider; private JLabel cleanupLabel; private JPanel statsPanel; private JLabel downloadCounterLabel; private JLabel activeDownloadCountLabel; private JLabel completedDownloadCountLabel; private DelayedUpdater updater; private Action addIgnoreAction; /** * Constructor * * @param controller */ public DownloadsInformationCard(Controller controller) { super(controller); updater = new DelayedUpdater(controller); } public InformationCardType getInformationCardType() { return InformationCardType.TRANSFERS; } /** * Gets the image for the card. * * @return */ public Image getCardImage() { return Icons.getImageById(Icons.FOLDER); } /** * Gets the title for the card. * * @return */ public String getCardTitle() { return Translation.getTranslation("exp.downloads_information_card.title"); } /** * Gets the ui component after initializing and building if necessary * * @return */ public JComponent getUIComponent() { if (uiComponent == null) { initialize(); buildUIComponent(); } return uiComponent; } /** * Initialize components */ private void initialize() { cleanupLabel = new JLabel(); cleanupLabel.setToolTipText( Translation.getTranslation("exp.downloads_information_card.auto_cleanup.frequency_tip")); buildToolbar(); tablePanel = new DownloadsTablePanel(getController(), openDownloadAction, abortDownloadsAction, clearCompletedDownloadsAction, addIgnoreAction); tablePanel.addTableModelListener(new MyTableModelListener()); tablePanel.addListSelectionListener(new MyListSelectionListener()); fileDetailsPanel = new FileDetailsPanel(getController(), true); fileVersionsPanel = new FileVersionsPanel(getController()); detailsPanel = createDetailsPanel(); detailsPanel.setVisible(false); buildStatsPanel(); update0(); } private void buildStatsPanel() { FormLayout layout = new FormLayout("3dlu, pref:grow, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref", "pref"); // active sep1 comp sep2 count DefaultFormBuilder builder = new DefaultFormBuilder(layout); CellConstraints cc = new CellConstraints(); activeDownloadCountLabel = new JLabel(); builder.add(activeDownloadCountLabel, cc.xy(3, 1)); JSeparator sep1 = new JSeparator(SwingConstants.VERTICAL); sep1.setPreferredSize(new Dimension(2, 12)); builder.add(sep1, cc.xy(5, 1)); completedDownloadCountLabel = new JLabel(); builder.add(completedDownloadCountLabel, cc.xy(7, 1)); JSeparator sep2 = new JSeparator(SwingConstants.VERTICAL); sep2.setPreferredSize(new Dimension(2, 12)); builder.add(sep2, cc.xy(9, 1)); downloadCounterLabel = new JLabel(); builder.add(downloadCounterLabel, cc.xy(11, 1)); statsPanel = builder.getPanel(); } /** * Build the toolbar component. */ private void buildToolbar() { abortDownloadsAction = new AbortDownloadAction(); openDownloadAction = new OpenFileAction(); clearCompletedDownloadsAction = new ClearCompletedDownloadsAction(getController()); addIgnoreAction = new AddIgnoreAction(getController()); // NOTE true cleanup days dereferenced through Constants.CLEANUP_VALUES Integer x = ConfigurationEntry.DOWNLOAD_AUTO_CLEANUP_FREQUENCY.getValueInt(getController()); if (x > 4) { x = 4; } cleanupSlider = new JSlider(0, 4, x) { public Dimension getPreferredSize() { return new Dimension(20, (int) super.getPreferredSize().getSize().getHeight()); } }; cleanupSlider.setMinorTickSpacing(1); cleanupSlider.setPaintTicks(true); cleanupSlider.setSnapToTicks(true); cleanupSlider.addChangeListener(new MyChangeListener()); cleanupSlider.setToolTipText( Translation.getTranslation("exp.downloads_information_card.auto_cleanup.frequency_tip")); ButtonBarBuilder bar = ButtonBarBuilder.createLeftToRightBuilder(); JToggleButton detailsBtn = new JToggleButton(new DetailsAction(getController())); detailsBtn.setIcon(null); bar.addGridded(detailsBtn); bar.addRelatedGap(); bar.addGridded(createButton(openDownloadAction)); bar.addRelatedGap(); bar.addGridded(createButton(abortDownloadsAction)); bar.addRelatedGap(); bar.addGridded(createButton(clearCompletedDownloadsAction)); bar.addRelatedGap(); bar.addGridded(cleanupSlider); toolBar = bar.getPanel(); updateCleanupLabel(); } private static JButton createButton(Action action) { JButton b = new JButton(action); b.setIcon(null); return b; } /** * Build the ui component pane. */ private void buildUIComponent() { FormLayout layout = new FormLayout("3dlu, pref, 3dlu, pref:grow, 3dlu", "3dlu, pref, 3dlu, pref, 3dlu, fill:pref:grow, 3dlu, pref, pref, pref"); // tools sep table dets sep stats DefaultFormBuilder builder = new DefaultFormBuilder(layout); CellConstraints cc = new CellConstraints(); builder.add(toolBar, cc.xy(2, 2)); builder.add(cleanupLabel, cc.xy(4, 2)); builder.addSeparator(null, cc.xyw(1, 4, 5)); builder.add(tablePanel.getUIComponent(), cc.xyw(2, 6, 3)); builder.add(detailsPanel, cc.xyw(2, 8, 3)); builder.addSeparator(null, cc.xyw(1, 9, 5)); builder.add(statsPanel, cc.xyw(2, 10, 3)); uiComponent = builder.getPanel(); initStatsTimer(); } private void initStatsTimer() { getController().scheduleAndRepeat(new MyStatsTask(), 100, 1000); } /** * Toggle the details panel visibility. */ public void toggleDetails() { detailsPanel.setVisible(!detailsPanel.isVisible()); } public void update() { updater.schedule(new Runnable() { public void run() { update0(); } }); } /** * Update actions and details. */ private void update0() { boolean singleCompleteSelected = tablePanel.isSingleCompleteSelected(); boolean rowsExist = tablePanel.isRowsExist(); boolean incompleteSelected = tablePanel.isIncompleteSelected(); openDownloadAction.setEnabled(singleCompleteSelected); abortDownloadsAction.setEnabled(incompleteSelected); clearCompletedDownloadsAction.setEnabled(rowsExist); addIgnoreAction.setEnabled(tablePanel.getSelectedRows().length > 0); fileDetailsPanel.setFileInfo(tablePanel.getSelectdFile()); fileVersionsPanel.setFileInfo(tablePanel.getSelectdFile()); } private void updateCleanupLabel() { ConfigurationEntry.DOWNLOAD_AUTO_CLEANUP_FREQUENCY.setValue(getController(), String.valueOf(cleanupSlider.getValue())); getController().saveConfig(); if (cleanupSlider.getValue() == 0) { cleanupLabel .setText(Translation.getTranslation("exp.downloads_information_card.auto_cleanup.immediate")); } else if (cleanupSlider.getValue() >= 4) { cleanupLabel.setText(Translation.getTranslation("exp.downloads_information_card.auto_cleanup.never")); } else { int trueCleanupDays = Constants.CLEANUP_VALUES[cleanupSlider.getValue()]; cleanupLabel.setText(Translation.getTranslation("exp.downloads_information_card.auto_cleanup.days", String.valueOf(trueCleanupDays))); } } private void displayStats() { int activeDownloadCount = tablePanel.countActiveDownloadCount(); activeDownloadCountLabel.setText( Translation.getTranslation("status.active_download_count", String.valueOf(activeDownloadCount))); int completedDownloadCount = tablePanel.countCompletedDownloadCount(); completedDownloadCountLabel.setText(Translation.getTranslation("status.completed_download_count", String.valueOf(completedDownloadCount))); double kbs = getController().getTransferManager().getDownloadCounter().calculateCurrentKBS(); downloadCounterLabel.setText(Translation.getTranslation("status.download", Format.formatDecimal(kbs))); } // ///////////////// // Inner Classes // // ///////////////// private class OpenFileAction extends BaseAction { OpenFileAction() { super("action_open_file", DownloadsInformationCard.this.getController()); } public void actionPerformed(ActionEvent e) { tablePanel.openSelectedDownload(); } } /** * Aborts the selected downloads * * @author <a href="mailto:totmacher@powerfolder.com">Christian Sprajc </a> * @version $Revision: 1.3 $ */ private class AbortDownloadAction extends BaseAction { AbortDownloadAction() { super("exp.action_abort_download", DownloadsInformationCard.this.getController()); } public void actionPerformed(ActionEvent e) { tablePanel.abortSelectedDownloads(); } } /** * Action to toggle the details panel. */ private class DetailsAction extends BaseAction { DetailsAction(Controller controller) { super("action_details", controller); } public void actionPerformed(ActionEvent e) { toggleDetails(); } } private JPanel createDetailsPanel() { FormLayout layout = new FormLayout("fill:pref:grow", "pref, 3dlu, pref"); // spacer, tabs DefaultFormBuilder builder = new DefaultFormBuilder(layout); CellConstraints cc = new CellConstraints(); // Spacer builder.addSeparator(null, cc.xy(1, 1)); JTabbedPane tabbedPane = new JTabbedPane(); builder.add(tabbedPane, cc.xy(1, 3)); tabbedPane.add(fileDetailsPanel.getPanel(), Translation.getTranslation("files_table_panel.file_details_tab.text")); tabbedPane.setToolTipTextAt(0, Translation.getTranslation("files_table_panel.file_details_tab.tip")); tabbedPane.add(fileVersionsPanel.getPanel(), Translation.getTranslation("files_table_panel.file_versions_tab.text")); tabbedPane.setToolTipTextAt(1, Translation.getTranslation("files_table_panel.file_versions_tab.tip")); return builder.getPanel(); } /** * Clears completed uploads. See MainFrame.MyCleanupAction for accelerator * functionality */ private class ClearCompletedDownloadsAction extends BaseAction { ClearCompletedDownloadsAction(Controller controller) { super("exp.action_clear_completed_downloads", controller); } public void actionPerformed(ActionEvent e) { tablePanel.clearDownloads(); } } /** * Listener to the underlying table model. Detects changes to row details * and updates actions. */ private class MyTableModelListener implements TableModelListener { public void tableChanged(TableModelEvent e) { update(); } } /** * Listener to the underlying table. Detects changes to row selections and * updates actions. */ private class MyListSelectionListener implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { update(); } } private class MyChangeListener implements ChangeListener { public void stateChanged(ChangeEvent e) { updateCleanupLabel(); } } private class MyStatsTask extends TimerTask { public void run() { displayStats(); } } private class AddIgnoreAction extends BaseAction { private AddIgnoreAction(Controller controller) { super("action_add_ignore", controller); } public void actionPerformed(ActionEvent e) { for (DownloadManager manager : tablePanel.getSelectedRows()) { if (manager != null) { FileInfo fileInfo = manager.getFileInfo(); Folder folder = getController().getFolderRepository().getFolder(fileInfo.getFolderInfo()); folder.addPattern(fileInfo.getRelativeName()); if (manager.isStarted()) { manager.abort(); } getController().getTransferManager().checkActiveTranfersForExcludes(); } } } } }