Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Class Members | File Members

HistogramEditor Class Reference

#include <histogramEditor.h>

Inheritance diagram for HistogramEditor:

Inheritance graph
[legend]
Collaboration diagram for HistogramEditor:

Collaboration graph
[legend]
List of all members.

Detailed Description

Interface for adjusting image historgram using upper and lower bounds and bright and contrast controls.

Definition at line 31 of file histogramEditor.h.

Public Member Functions

 HistogramEditor (QString filename, QWidget *parent=0, const char *name=0)
 Constructs layout.
 ~HistogramEditor ()
QImage * getModifiedImage ()
 get modified image that resulted from adjustments
void getHistBoundaries (int &lumLeft, int &lumRight, int &redLeft, int &redRight, int &greenLeft, int &greenRight, int &blueLeft, int &blueRight)
 returns histogram boundaries

Protected Member Functions

void keyPressEvent (QKeyEvent *e)
void keyReleaseEvent (QKeyEvent *e)

Private Slots

void selectPreviewImageType (int selection)
 updates preview image
void selectHistogramType (int selection)
 updates historgram interface
void resetBrightness ()
 reset brightness
void resetContrast ()
 reset contrast
void applyAction ()
 check for changes to settings, if so
void resetAction ()
 resets all adjustments
void generateAdjustedPreviewImage ()
 updates adjusted preview image

Private Member Functions

void adjustImage (QImage &image)
double scaleColor (double color, int left, int right)

Private Attributes

QString fileName
double meanR
 Mean color values.
double meanG
 Mean color values.
double meanB
 Mean color values.
ScaledPreviewInterfacepreviewInterface
 Preview image.
HistogramInterfacehistogramInterface
 Histogram view.
QComboBox * previewSelection
QComboBox * histogramType
ClickableLabelbrightnessIcon
ClickableLabelcontrastIcon
QFramebuttonsFrame
DynamicSliderbrightness
 Brightness slider.
DynamicSlidercontrast
 Contrast slider.


Constructor & Destructor Documentation

HistogramEditor::HistogramEditor QString  filename,
QWidget parent = 0,
const char *  name = 0
 

Constructs layout.

Definition at line 33 of file histogramEditor.cpp.

References applyAction(), b, brightness, brightnessIcon, buttonsFrame, contrast, contrastIcon, generateAdjustedPreviewImage(), histogramInterface, histogramType, IMAGE_PATH, meanB, meanG, meanR, previewInterface, previewSelection, resetAction(), resetBrightness(), resetContrast(), selectHistogramType(), selectPreviewImageType(), ClickableLabel::setPixmap(), DynamicSlider::setPrefixes(), DynamicSlider::setZeroString(), SLIDER_RADIUS, and WIDGET_SPACING.

00033                                                                                       : QDialog(parent,name,true)
00034 {
00035   //set pointer to null to make sure no 
00036   //random data is ever accessed by the preview interface
00037   histogramInterface = NULL;
00038 
00039   //record filename
00040   this->fileName = fileName;
00041   
00042   //-----
00043   //find mean color values
00044   meanR = 0;
00045   meanG = 0;
00046   meanB = 0;
00047   int x, y;
00048   QRgb* rgb;
00049   uchar* scanLine;
00050   QImage image = QImage( fileName );
00051   for( y=0; y<image.height(); y++)
00052   {   
00053     scanLine = image.scanLine(y);
00054     for( x=0; x<image.width(); x++)
00055     {
00056       rgb = ((QRgb*)scanLine+x);
00057       double r = ((double)qRed(*rgb)   )/255.0;
00058       double g = ((double)qGreen(*rgb) )/255.0;
00059       double b = ((double)qBlue(*rgb)  )/255.0;
00060       
00061       meanR+=r;
00062       meanG+=g;
00063       meanB+=b;
00064     } //x
00065   } //y
00066   meanR = meanR / ( image.width() * image.height() );
00067   meanG = meanG / ( image.width() * image.height() );
00068   meanB = meanB / ( image.width() * image.height() );
00069   
00070   QFrame* visibleFrame = new QFrame( this, "visible widgets" );
00071   //--------------  
00072   //Preview frame: 
00073   previewInterface = new ScaledPreviewInterface( fileName, visibleFrame, 
00074                                                  "previewInterface" );
00075   connect( previewInterface, SIGNAL(resized()), 
00076            this, SLOT(generateAdjustedPreviewImage()) );  
00077 
00078   previewSelection = new QComboBox( visibleFrame, "previewSelction" );
00079   previewSelection->insertItem( tr("Split View") );
00080   previewSelection->insertItem( tr("Original Image") );
00081   previewSelection->insertItem( tr("Adjusted Image") );
00082   connect( previewSelection, SIGNAL(activated(int)), this, SLOT(selectPreviewImageType(int)) );  
00083   //--------------
00084   //Adjust frame:   
00085   histogramInterface = new HistogramInterface( fileName, visibleFrame, 
00086                                                "histogramInterface" );  
00087 
00088   //connect adjustments in histogram to generateAdjustedPreviewImage
00089   connect( histogramInterface, SIGNAL( selectedRangeChanged() ),
00090            SLOT( generateAdjustedPreviewImage() ) );
00091   
00092   QToolTip::add( histogramInterface, tr("Click and drag to select tonal range") );  
00093 
00094   histogramType = new QComboBox( visibleFrame, "histogramType" );
00095   histogramType->insertItem( tr("Luminosity") );
00096   histogramType->insertItem( tr("Red") );
00097   histogramType->insertItem( tr("Green") );
00098   histogramType->insertItem( tr("Blue") );  
00099   connect( histogramType, SIGNAL(activated(int)), this, SLOT(selectHistogramType(int)) );  
00100   QToolTip::add( histogramType, tr("Histogram channel displayed") );  
00101   //--------------
00102   //Slider frame:
00103   QString noChange = QString( tr("No change") );
00104   
00105   brightness = new DynamicSlider( Qt::Vertical, visibleFrame );
00106   brightness->setZeroString( noChange );
00107   brightness->setPrefixes("", "+");
00108   brightness->setMinValue( -SLIDER_RADIUS );
00109   brightness->setMaxValue( SLIDER_RADIUS );
00110   connect( brightness, SIGNAL(valueChanged(int)),
00111            this, SLOT(generateAdjustedPreviewImage()) );;
00112   QToolTip::add( brightness, tr("Drag to adjust image brightness") );  
00113            
00114   brightnessIcon = new ClickableLabel( visibleFrame, "brightnessIcon" );
00115   brightnessIcon->setPixmap( QPixmap(QString(IMAGE_PATH)+"miscImages/brightness.png") );
00116   connect( brightnessIcon, SIGNAL(clicked()), SLOT(resetBrightness()) );    
00117   QToolTip::add( brightnessIcon, tr("Reset brightness") );
00118 
00119   contrast = new DynamicSlider( Qt::Vertical, visibleFrame );
00120   contrast->setZeroString( noChange );
00121   contrast->setPrefixes("", "+");
00122   contrast->setMinValue( -SLIDER_RADIUS );
00123   contrast->setMaxValue( SLIDER_RADIUS );
00124   connect( contrast, SIGNAL(valueChanged(int)),
00125            this, SLOT(generateAdjustedPreviewImage()) );
00126   QToolTip::add( contrast, tr("Drag to adjust image contrast") );  
00127 
00128   contrastIcon = new ClickableLabel( visibleFrame, "contrastIcon" );
00129   contrastIcon->setPixmap( QPixmap(QString(IMAGE_PATH)+"miscImages/contrast.png") );
00130   connect( contrastIcon, SIGNAL(clicked()), SLOT(resetContrast()) );    
00131   QToolTip::add( contrastIcon, tr("Reset contrast") );
00132   //--------------
00133   //Dialog buttons:  
00134   buttonsFrame =   new QFrame( visibleFrame, "dialogButtons" );
00135 
00136   QPushButton* applyButton = new QPushButton( tr("Apply"), buttonsFrame );
00137   applyButton->setDefault(true);
00138   applyButton->setFocus();
00139   connect( applyButton, SIGNAL(clicked()), SLOT(applyAction()) );
00140                                 
00141   QPushButton* cancelButton = new QPushButton( tr("Cancel"), buttonsFrame );
00142   connect( cancelButton, SIGNAL(clicked()), SLOT(reject()) );
00143 
00144   QPushButton* resetButton = new QPushButton( tr("Reset"), buttonsFrame );
00145   connect( resetButton, SIGNAL(clicked()), SLOT(resetAction()) );
00146 
00147   QGridLayout* buttonsGrid = new QGridLayout( buttonsFrame, 1, 5, 0 );
00148   buttonsGrid->setColStretch( 0, 1 );
00149   buttonsGrid->addWidget( applyButton,  0, 1 );
00150   buttonsGrid->addWidget( cancelButton, 0, 2 );
00151   buttonsGrid->addWidget( resetButton, 0, 3 );
00152   buttonsGrid->setColStretch( 4, 1 );  
00153   buttonsGrid->setSpacing( WIDGET_SPACING );
00154   //--------------
00155   QGridLayout* mainGrid = new QGridLayout( visibleFrame, 5, 3, 0 );
00156   
00157   mainGrid->addMultiCellWidget( previewInterface,     0,0, 0,2 );
00158   mainGrid->addMultiCellWidget( previewSelection, 1,1, 0,2, Qt::AlignHCenter );  
00159    
00160   mainGrid->addWidget( histogramInterface,    2, 0 ); 
00161   mainGrid->addWidget( brightness,            2, 1 );
00162   mainGrid->addWidget( contrast,              2, 2 );
00163   
00164   //make sure sliders have enough space so all slider units are settable
00165   mainGrid->setRowSpacing( 2, 2*SLIDER_RADIUS + 5) ;
00166     
00167   mainGrid->addWidget( histogramType,    3, 0, Qt::AlignHCenter );
00168   mainGrid->addWidget( brightnessIcon,   3, 1 );  
00169   mainGrid->addWidget( contrastIcon,     3, 2 );  
00170   
00171   mainGrid->addMultiCellWidget( buttonsFrame, 4,4, 0,2 );
00172 
00173   mainGrid->setRowStretch( 0, 1 );
00174   mainGrid->setColStretch( 0, 1 );
00175   
00176   mainGrid->setSpacing( WIDGET_SPACING );
00177   mainGrid->setMargin( WIDGET_SPACING );
00178   
00179   QGridLayout* invisibleGrid = new QGridLayout( this, 2, 1, 0 );
00180   invisibleGrid->addWidget( visibleFrame, 0, 0 );
00181   invisibleGrid->setRowStretch( 0, 1 );
00182   
00183   //PLATFORM_SPECIFIC_CODE
00184   //windows users expect a grip, but qt doesn't put one in by default. we'll add
00185   //it for them too. :-)
00186 #if defined(Q_OS_WIN)
00187   QSizeGrip* sizeGrip = new QSizeGrip( this );
00188   invisibleGrid->addWidget( sizeGrip, 1, 0, Qt::AlignRight | Qt::AlignBottom );
00189 #endif
00190   
00191   
00192   
00193   
00194   //Window caption
00195   setCaption( tr("Histogram Editor") );
00196   //-------------------------------
00197 }

HistogramEditor::~HistogramEditor  ) 
 

Definition at line 199 of file histogramEditor.cpp.

00199 { }


Member Function Documentation

void HistogramEditor::adjustImage QImage &  image  )  [private]
 

Definition at line 295 of file histogramEditor.cpp.

References b, brightness, contrast, HistogramInterface::getHistBoundaries(), histogramInterface, HSVtoRGB(), meanB, meanG, meanR, RGBtoHSV(), scaleColor(), and SLIDER_RADIUS.

Referenced by generateAdjustedPreviewImage(), and getModifiedImage().

00296 {
00297   //obtain histogram left and right boundaries
00298   //sanity check
00299   int lumLeft, lumRight, redLeft, redRight, greenLeft, greenRight, blueLeft, blueRight;
00300   if( histogramInterface )
00301   {
00302     histogramInterface->getHistBoundaries( lumLeft, lumRight,
00303                                            redLeft, redRight,
00304                                            greenLeft, greenRight,
00305                                            blueLeft, blueRight );
00306   }
00307   else
00308   {
00309     lumLeft = 0; lumRight = 255;
00310     redLeft = 0; redRight = 255;
00311     greenLeft = 0; greenRight = 255;
00312     blueLeft = 0; blueRight = 255;
00313   }
00314   
00315   //modify image
00316   double displayToOneScalar = 1.0/255.0;
00317   double scaledMeanR = displayToOneScalar*scaleColor( 255.0*meanR, redLeft, redRight );
00318   double scaledMeanG = displayToOneScalar*scaleColor( 255.0*meanG, greenLeft, greenRight );
00319   double scaledMeanB = displayToOneScalar*scaleColor( 255.0*meanB, blueLeft, blueRight );
00320   
00321   double brightnessScalar, addedBrightnessColor;
00322   if(brightness->value() < 0)
00323   {
00324     brightnessScalar = ((double)(SLIDER_RADIUS + brightness->value()))/SLIDER_RADIUS;
00325     addedBrightnessColor = 1.0 - brightnessScalar;
00326   }
00327   else
00328   {
00329     brightnessScalar = ((double)(SLIDER_RADIUS - brightness->value()))/SLIDER_RADIUS;
00330     addedBrightnessColor = 0.0;
00331   }
00332   
00333   int x, y;  
00334   QRgb* rgb;
00335   double r,g,b;
00336   double h,s,v;
00337   int rPrime, gPrime, bPrime;
00338   uchar* scanLine;
00339   
00340   for( y=0; y<image.height(); y++)
00341   {   
00342     scanLine = image.scanLine(y);
00343     for( x=0; x<image.width(); x++)
00344     {
00345       //get rgb value
00346       rgb = ((QRgb*)scanLine+x);
00347       r = qRed(*rgb);
00348       g = qGreen(*rgb);
00349       b = qBlue(*rgb);
00350       
00351       //apply histogram boundaries
00352       RGBtoHSV(r,g,b,&h,&s,&v);
00353       v = scaleColor( v, lumLeft, lumRight );
00354       HSVtoRGB( &r,&g,&b, h,s,v);         
00355       
00356       r = scaleColor( r, redLeft, redRight );
00357       g = scaleColor( g, greenLeft, greenRight );
00358       b = scaleColor( b, blueLeft, blueRight );
00359       
00360       //convert to 0-1 scale
00361       r = r*displayToOneScalar;
00362       g = g*displayToOneScalar;
00363       b = b*displayToOneScalar;
00364       
00365       //adjust contrast
00366       r = ( (r-scaledMeanR) * (SLIDER_RADIUS-contrast->value()) )/SLIDER_RADIUS + scaledMeanR;
00367       g = ( (g-scaledMeanG) * (SLIDER_RADIUS-contrast->value()) )/SLIDER_RADIUS + scaledMeanG;
00368       b = ( (b-scaledMeanB) * (SLIDER_RADIUS-contrast->value()) )/SLIDER_RADIUS + scaledMeanB;
00369       
00370       //apply brightness adjustment
00371       //http://www.sgi.com/misc/grafica/interp/
00372       r = brightnessScalar*r + addedBrightnessColor;
00373       g = brightnessScalar*g + addedBrightnessColor;
00374       b = brightnessScalar*b + addedBrightnessColor;
00375       
00376       //scale and clamp to 0-255 range
00377       rPrime = (int) QMIN( QMAX((r*255), 0), 255 );
00378       gPrime = (int) QMIN( QMAX((g*255), 0), 255 );
00379       bPrime = (int) QMIN( QMAX((b*255), 0), 255 );
00380       
00381       //set adjusted color value
00382       *rgb = qRgb(rPrime, gPrime, bPrime);          
00383     } //x
00384   } //y  
00385 }

void HistogramEditor::applyAction  )  [private, slot]
 

check for changes to settings, if so

Definition at line 201 of file histogramEditor.cpp.

References brightness, contrast, HistogramInterface::getHistBoundaries(), and histogramInterface.

Referenced by HistogramEditor().

00202 {
00203   //check if user has adjusted brightness, contrast, or histogram ranges.
00204   //if any changes have taken place call "accept", else "reject" so image is not
00205   //updated and appear modified
00206   int lumLeft, lumRight, redLeft, redRight, greenLeft, greenRight, blueLeft, blueRight;
00207   histogramInterface->getHistBoundaries( lumLeft, lumRight,
00208                                          redLeft, redRight,
00209                                          greenLeft, greenRight,
00210                                          blueLeft, blueRight );  
00211   if( brightness->value() != 0 || contrast->value()   != 0 ||
00212       lumLeft != 0 || lumRight != 255 ||
00213       redLeft !=0 || redRight != 255 ||
00214       greenLeft != 0 || greenRight != 255 ||
00215       blueLeft != 0 || blueRight != 255 )
00216   { accept(); }
00217   else
00218   { reject(); }  
00219 }

void HistogramEditor::generateAdjustedPreviewImage  )  [private, slot]
 

updates adjusted preview image

Definition at line 282 of file histogramEditor.cpp.

References adjustImage(), SplitViewInterface::getOrigImage(), previewInterface, and SplitViewInterface::setAdjustedImage().

Referenced by HistogramEditor().

00283 {
00284   //get original image
00285   QImage origImage = previewInterface->getOrigImage();
00286 
00287   //construct adjusted image
00288   QImage adjustedImage = origImage.copy();
00289   adjustImage( adjustedImage );
00290   
00291   //set adjusted image
00292   previewInterface->setAdjustedImage( adjustedImage );
00293 }

void HistogramEditor::getHistBoundaries int &  lumLeft,
int &  lumRight,
int &  redLeft,
int &  redRight,
int &  greenLeft,
int &  greenRight,
int &  blueLeft,
int &  blueRight
 

returns histogram boundaries

Definition at line 260 of file histogramEditor.cpp.

References HistogramInterface::getHistBoundaries(), and histogramInterface.

00264 {
00265   //sanity check
00266   if( histogramInterface )
00267   {
00268     histogramInterface->getHistBoundaries( lumLeft, lumRight,
00269                                            redLeft, redRight,
00270                                            greenLeft, greenRight,
00271                                            blueLeft, blueRight );
00272   }
00273   else
00274   {
00275     lumLeft = 0; lumRight = 255;
00276     redLeft = 0; redRight = 255;
00277     greenLeft = 0; greenRight = 255;
00278     blueLeft = 0; blueRight = 255;
00279   }
00280 }

QImage * HistogramEditor::getModifiedImage  ) 
 

get modified image that resulted from adjustments

Definition at line 228 of file histogramEditor.cpp.

References adjustImage(), and fileName.

00229 { 
00230   QImage* adjustedImage = new QImage(fileName);
00231   
00232   //convert to 32-bit depth if necessary
00233   if( adjustedImage->depth() < 32 )
00234   {
00235     QImage* tmp = adjustedImage;
00236     adjustedImage = new QImage( tmp->convertDepth( 32, Qt::AutoColor ) );
00237     delete tmp; tmp=NULL;
00238   }
00239   
00240   adjustImage( *adjustedImage );
00241   return adjustedImage;  
00242 }

void HistogramEditor::keyPressEvent QKeyEvent *  e  )  [protected]
 

Definition at line 392 of file histogramEditor.cpp.

References ADJUSTED_IMAGE, INV_SPLIT_VIEW, ORIGINAL_IMAGE, PREVIEW_MODE, previewInterface, previewSelection, and SplitViewInterface::setPreviewMode().

00393 {
00394   if(e->key() == Qt::Key_Control )
00395   {
00396     PREVIEW_MODE curMode = (PREVIEW_MODE) previewSelection->currentItem();
00397     if(curMode == ORIGINAL_IMAGE)
00398       previewInterface->setPreviewMode( ADJUSTED_IMAGE, true );
00399     else if(curMode == ADJUSTED_IMAGE)
00400       previewInterface->setPreviewMode( ORIGINAL_IMAGE, true );
00401     else
00402       previewInterface->setPreviewMode( INV_SPLIT_VIEW );
00403   }
00404   else { QDialog::keyPressEvent(e); }
00405 }

void HistogramEditor::keyReleaseEvent QKeyEvent *  e  )  [protected]
 

Definition at line 407 of file histogramEditor.cpp.

References PREVIEW_MODE, previewInterface, previewSelection, and SplitViewInterface::setPreviewMode().

00408 {
00409   if(e->key() == Qt::Key_Control )
00410   {
00411     previewInterface->setPreviewMode( (PREVIEW_MODE) previewSelection->currentItem(), 
00412                                       false );
00413   }
00414   else { QDialog::keyReleaseEvent(e); }
00415 }

void HistogramEditor::resetAction  )  [private, slot]
 

resets all adjustments

Definition at line 221 of file histogramEditor.cpp.

References histogramInterface, HistogramInterface::resetBoundaries(), resetBrightness(), and resetContrast().

Referenced by HistogramEditor().

00222 {
00223   histogramInterface->resetBoundaries();
00224   resetBrightness();
00225   resetContrast();
00226 }

void HistogramEditor::resetBrightness  )  [private, slot]
 

reset brightness

Definition at line 254 of file histogramEditor.cpp.

References brightness.

Referenced by HistogramEditor(), and resetAction().

00255 { brightness->setValue( 0 ); }

void HistogramEditor::resetContrast  )  [private, slot]
 

reset contrast

Definition at line 257 of file histogramEditor.cpp.

References contrast.

Referenced by HistogramEditor(), and resetAction().

00258 { contrast->setValue( 0 ); }

double HistogramEditor::scaleColor double  color,
int  left,
int  right
[private]
 

Definition at line 387 of file histogramEditor.cpp.

Referenced by adjustImage().

00388 {
00389   return QMAX( QMIN( (255.0*(color-left)) / (right-left), 255), 0 );  
00390 }

void HistogramEditor::selectHistogramType int  selection  )  [private, slot]
 

updates historgram interface

Definition at line 249 of file histogramEditor.cpp.

References DISPLAYED_CHANNEL, histogramInterface, and HistogramInterface::setDisplayChannel().

Referenced by HistogramEditor().

00250 {
00251   histogramInterface->setDisplayChannel( (DISPLAYED_CHANNEL) selection );
00252 }

void HistogramEditor::selectPreviewImageType int  selection  )  [private, slot]
 

updates preview image

Definition at line 244 of file histogramEditor.cpp.

References PREVIEW_MODE, previewInterface, and SplitViewInterface::setPreviewMode().

Referenced by HistogramEditor().

00245 {
00246   previewInterface->setPreviewMode( (PREVIEW_MODE)selection );
00247 }


Member Data Documentation

DynamicSlider* HistogramEditor::brightness [private]
 

Brightness slider.

Definition at line 105 of file histogramEditor.h.

Referenced by adjustImage(), applyAction(), HistogramEditor(), and resetBrightness().

ClickableLabel* HistogramEditor::brightnessIcon [private]
 

Definition at line 99 of file histogramEditor.h.

Referenced by HistogramEditor().

QFrame* HistogramEditor::buttonsFrame [private]
 

Definition at line 101 of file histogramEditor.h.

Referenced by HistogramEditor().

DynamicSlider* HistogramEditor::contrast [private]
 

Contrast slider.

Definition at line 108 of file histogramEditor.h.

Referenced by adjustImage(), applyAction(), HistogramEditor(), and resetContrast().

ClickableLabel* HistogramEditor::contrastIcon [private]
 

Definition at line 100 of file histogramEditor.h.

Referenced by HistogramEditor().

QString HistogramEditor::fileName [private]
 

Definition at line 86 of file histogramEditor.h.

Referenced by getModifiedImage().

HistogramInterface* HistogramEditor::histogramInterface [private]
 

Histogram view.

Definition at line 95 of file histogramEditor.h.

Referenced by adjustImage(), applyAction(), getHistBoundaries(), HistogramEditor(), resetAction(), and selectHistogramType().

QComboBox* HistogramEditor::histogramType [private]
 

Definition at line 98 of file histogramEditor.h.

Referenced by HistogramEditor().

double HistogramEditor::meanB [private]
 

Mean color values.

Definition at line 89 of file histogramEditor.h.

Referenced by adjustImage(), and HistogramEditor().

double HistogramEditor::meanG [private]
 

Mean color values.

Definition at line 89 of file histogramEditor.h.

Referenced by adjustImage(), and HistogramEditor().

double HistogramEditor::meanR [private]
 

Mean color values.

Definition at line 89 of file histogramEditor.h.

Referenced by adjustImage(), and HistogramEditor().

ScaledPreviewInterface* HistogramEditor::previewInterface [private]
 

Preview image.

Definition at line 92 of file histogramEditor.h.

Referenced by generateAdjustedPreviewImage(), HistogramEditor(), keyPressEvent(), keyReleaseEvent(), and selectPreviewImageType().

QComboBox* HistogramEditor::previewSelection [private]
 

Definition at line 97 of file histogramEditor.h.

Referenced by HistogramEditor(), keyPressEvent(), and keyReleaseEvent().


The documentation for this class was generated from the following files:
Generated on Mon Apr 11 18:28:48 2005 for AlbumShaper by  doxygen 1.3.9.1