/** * */ package org.gudy.azureus2.ui.swt.pluginsimpl; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.custom.CLabel; import org.gudy.azureus2.core3.util.AEMonitor; import org.gudy.azureus2.ui.swt.ImageRepository; import org.gudy.azureus2.ui.swt.mainwindow.MainStatusBar; import org.gudy.azureus2.ui.swt.plugins.UISWTStatusEntry; import org.gudy.azureus2.ui.swt.plugins.UISWTStatusEntryListener; /** * @author Allan Crooks * */ public class UISWTStatusEntryImpl implements UISWTStatusEntry, MainStatusBar.CLabelUpdater { private AEMonitor this_mon = new AEMonitor("UISWTStatusEntryImpl@" + Integer.toHexString(this.hashCode())); private UISWTStatusEntryListener listener = null; // Used by "update". private boolean needs_update = false; private String text = null; private String tooltip = null; private boolean image_enabled = false; private Image image = null; private boolean is_visible = false; private boolean needs_disposing = false; private boolean is_destroyed = false; private void checkDestroyed() { if (is_destroyed) {throw new RuntimeException("object is destroyed, cannot be reused");} } public void update(CLabel label) { if (needs_disposing && !label.isDisposed()) {label.dispose(); return;} if (!needs_update) {return;} // This is where we do a big update. try { this_mon.enter(); update0(label); } finally { this_mon.exit(); } } private void update0(CLabel label) { label.setText(text); label.setToolTipText(tooltip); label.setImage(image_enabled ? image : null); label.setVisible(this.is_visible); } void onClick() { UISWTStatusEntryListener listener0 = listener; // Avoid race conditions. if (listener0 != null) {listener.entryClicked(this);} } public void destroy() { try { this_mon.enter(); this.is_visible = false; this.listener = null; this.image = null; this.needs_disposing = true; this.is_destroyed = true; } finally { this_mon.exit(); } } public void setImage(int image_id) { String img_name; switch (image_id) { case IMAGE_LED_GREEN: img_name = "greenled"; break; case IMAGE_LED_RED: img_name = "redled"; break; case IMAGE_LED_YELLOW: img_name = "yellowled"; break; default: img_name = "grayled"; break; } this.setImage(ImageRepository.getImage(img_name)); } public void setImage(Image image) { checkDestroyed(); this_mon.enter(); this.image = image; this.needs_update = true; this_mon.exit(); } public void setImageEnabled(boolean enabled) { checkDestroyed(); this_mon.enter(); this.image_enabled = enabled; this.needs_update = true; this_mon.exit(); } public void setListener(UISWTStatusEntryListener listener) { checkDestroyed(); this.listener = listener; } public void setText(String text) { checkDestroyed(); this_mon.enter(); this.text = text; this.needs_update = true; this_mon.exit(); } public void setTooltipText(String text) { checkDestroyed(); this_mon.enter(); this.tooltip = text; this.needs_update = true; this_mon.exit(); } public void setVisible(boolean visible) { checkDestroyed(); this_mon.enter(); this.is_visible = visible; this.needs_update = true; this_mon.exit(); } }