/* * @(#)JActivityIndicator.java * * Copyright (c) 2011 The authors and contributors of JHotDraw. * * You may not use, copy or modify this file, except in compliance with the * license agreement you entered into with the copyright holders. For details * see accompanying license terms. */ package org.jhotdraw.gui; import java.awt.Dimension; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import javax.swing.DefaultBoundedRangeModel; import org.jhotdraw.gui.event.ActivityManagerEvent; import org.jhotdraw.gui.event.ActivityManagerListener; import org.jhotdraw.util.ResourceBundleUtil; /** * This indicator displays a progress bar when an {@code ActivityModel} is active. * <p> * The indicator can indicate all activities or only those belonging to a * specific owner, see {@link #setActivityOwner}. * <hr> * <b>Design Patterns</b> * * <p><em>Framework</em><br> * The interfaces and classes listed below define a framework for progress * management.<br> * Contract: {@link ActivityManager}, {@link ActivityModel}, * {@link JActivityWindow}, {@link JActivityIndicator}. * * @author Werner Randelshofer * @version 1.0 2011-09-08 Created. */ public class JActivityIndicator extends javax.swing.JPanel { private static final long serialVersionUID = 1L; private ArrayList<ActivityModel> models = new ArrayList<ActivityModel>(); private class Handler implements ActivityManagerListener, PropertyChangeListener { @Override public void activityModelAdded(ActivityManagerEvent evt) { ActivityModel pm = evt.getActivityModel(); if (progressOwner == null || progressOwner.equals(pm.getOwner())) { addActivityModel(pm); } } @Override public void activityModelRemoved(ActivityManagerEvent evt) { ActivityModel pm = evt.getActivityModel(); removeActivityModel(pm); } @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName() == ActivityModel.INDETERMINATE_PROPERTY) { updateIndeterminate(); } if (evt.getPropertyName() == ActivityModel.NOTE_PROPERTY) { updateToolTip(); } } } private Handler handler = new Handler(); private ActivityManager manager; private Object progressOwner; private ResourceBundleUtil labels; /** Creates new form JActivityIndicator */ public JActivityIndicator() { labels = ResourceBundleUtil.getBundle("org.jhotdraw.gui.Labels"); initComponents(); setActivityManager(ActivityManager.getInstance()); } public ActivityManager getActivityManager() { return manager; } public void setActivityManager(ActivityManager newValue) { if (manager != null) { manager.removeActivityManagerListener(handler); } this.manager = newValue; if (manager != null) { manager.addActivityManagerListener(handler); } updateActivityModels(); updateProgressBar(); updateToolTip(); } public Object getActivityOwner() { return progressOwner; } public void setActivityOwner(Object progressOwner) { this.progressOwner = progressOwner; updateActivityModels(); } public void addActivityModel(final ActivityModel model) { if (progressOwner == null || model.getOwner() == progressOwner) { models.add(model); model.addPropertyChangeListener(handler); updateProgressBar(); updateToolTip(); updateIndeterminate(); } } public void removeActivityModel(final ActivityModel model) { if (models.remove(model)) { model.removePropertyChangeListener(handler); updateProgressBar(); updateToolTip(); updateIndeterminate(); } } private void updateActivityModels() { for (ActivityModel pm : models) { pm.removePropertyChangeListener(handler); } models.clear(); if (manager != null) { for (ActivityModel pm : manager.getActivityModels()) { if (progressOwner == null || pm.getOwner() == progressOwner) { models.add(pm); } } } updateProgressBar(); updateIndeterminate(); updateToolTip(); } @Override public Dimension getPreferredSize() { return progressBar.getPreferredSize(); } private void updateProgressBar() { if (models.isEmpty()) { progressBar.setModel(new DefaultBoundedRangeModel()); progressBar.setEnabled(false); progressBar.setVisible(false); } else if (models.size() == 1) { progressBar.setModel(models.get(0)); progressBar.setEnabled(true); progressBar.setVisible(true); } else { progressBar.setModel(new DefaultBoundedRangeModel()); progressBar.setEnabled(true); progressBar.setVisible(true); } } private void updateToolTip() { if (models.isEmpty()) { setToolTipText(labels.getString("ActivityIndicator.noActivities.toolTipText")); } else if (models.size() == 1) { setToolTipText(models.get(0).getTitle()); //setToolTipText(labels.getString("ActivityIndicator.oneActivity.toolTipText")); } else { setToolTipText(labels.getFormatted("ActivityIndicator.nActivities.toolTipText", models.size())); } } private void updateIndeterminate() { if (models.size() == 0) { progressBar.setIndeterminate(false); } else if (models.size() == 1) { progressBar.setIndeterminate(models.get(0).isIndeterminate()); } else { progressBar.setIndeterminate(true); } } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { progressBar = new javax.swing.JProgressBar(); setLayout(new java.awt.BorderLayout()); add(progressBar, java.awt.BorderLayout.CENTER); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JProgressBar progressBar; // End of variables declaration//GEN-END:variables }