00001 #include "pluginset.h" 00002 #include <qmessagebox.h> 00003 00004 PluginSet::PluginSet( QWidget *parent, 00005 QPopupMenu *menuparent ) : 00006 QWidget( parent ), 00007 PLUGCFG_FNAME( "plugins/plugcfg.xml" ), 00008 mMenuParent( menuparent ) { 00009 mMenuGroup = NULL; 00010 mProj = NULL; 00011 00012 QAction *action; 00013 action = new QAction( tr("Configure"), tr("&Configure"), 0, this ); 00014 action->addTo( menuparent ); 00015 connect( action, 00016 SIGNAL( activated() ), 00017 this, 00018 SLOT( showPluginCfg() ) ); 00019 00020 menuparent->insertSeparator(); 00021 00022 buildWidget(); 00023 resize( 300, 250 ); 00024 00025 fromXMLFile( PLUGCFG_FNAME, "PluginConfig" ); 00026 loadList(); 00027 loadMenu(); 00028 } 00029 00030 void PluginSet::buildWidget( ) { 00031 setCaption( "Plugin Configurator" ); 00032 00033 QVBoxLayout *main = new QVBoxLayout( this ); 00034 main->setAutoAdd( true ); 00035 00036 QGroupBox *gbox; 00037 QPushButton *pbut; 00038 00039 gbox = new QGroupBox( 1, Qt::Vertical, "Plugins", this ); 00040 mPlugList = new QListView( gbox ); 00041 mPlugList->addColumn( "Name" ); 00042 mPlugList->addColumn( "File", 150 ); 00043 mPlugList->setMinimumSize( 200, 75 ); 00044 mPlugList->setMaximumHeight( 125 ); 00045 connect( mPlugList, 00046 SIGNAL( selectionChanged( QListViewItem * ) ), 00047 this, 00048 SLOT( selectedPluginChanged( QListViewItem * ) ) ); 00049 00050 gbox = new QGroupBox( 1, Qt::Vertical, "Description", this ); 00051 mDescBox = new QMultiLineEdit( gbox ); 00052 mDescBox->setMinimumSize( 200, 75 ); 00053 mDescBox->setWordWrap( QMultiLineEdit::WidgetWidth ); 00054 00055 QHBox *hbox = new QHBox( this ); 00056 pbut = new QPushButton( "Import", hbox ); 00057 connect( pbut, 00058 SIGNAL( clicked() ), 00059 this, 00060 SLOT( importPlugin() ) ); 00061 00062 pbut = new QPushButton( "Rescan", hbox ); 00063 connect( pbut, 00064 SIGNAL( clicked() ), 00065 this, 00066 SLOT( rescanDir() ) ); 00067 00068 pbut = new QPushButton( "Close", hbox ); 00069 connect( pbut, 00070 SIGNAL( clicked() ), 00071 this, 00072 SLOT( hide() ) ); 00073 } 00074 00075 bool PluginSet::toXML( QDomDocument &doc, 00076 QDomElement &elem, 00077 std::string id ) { 00078 QDomElement base = doc.createElement( "PluginSet" ); 00079 if ( id != "" ) 00080 base.setAttribute( "id", (char*)id.c_str() ); 00081 elem.appendChild( base ); 00082 00083 for ( int i=0; i < (int)mPlugSet.size(); i++ ) 00084 mPlugSet[i].toXML( doc, base ); 00085 00086 return true; 00087 } 00088 00089 bool PluginSet::fromXML( QDomElement &elem ) { 00090 if ( elem.isNull() ) 00091 return false; 00092 00093 if ( std::string( "PluginSet" ).compare( (const char*)elem.tagName() ) ) 00094 return false; 00095 00096 QDomNodeList list = elem.elementsByTagName( "Plugin" ); 00097 QDomElement e; 00098 for ( int i=0; i < (int)list.count(); i++ ) { 00099 Plugin plug; 00100 e = list.item( i ).toElement(); 00101 plug.fromXML( e ); 00102 mPlugSet.push_back( plug ); 00103 } 00104 00105 return true; 00106 } 00107 00108 void PluginSet::importPlugin( ) { 00109 QString fname = 00110 QFileDialog::getOpenFileName( "", "", NULL, "", "Plugin File Chooser" ); 00111 if ( fname.isNull() ) 00112 return; 00113 00114 Plugin plug; 00115 if ( plug.loadFromFile( (const char*)fname ) ) { 00116 for ( int i=0; i < (int)mPlugSet.size(); i++ ) { 00117 if ( mPlugSet[i].getName() == plug.getName() ) { 00118 QMessageBox::information( 00119 NULL, 00120 "Plugin Load Error", 00121 "Plugin with same name already exists" ); 00122 return; 00123 } 00124 } 00125 mPlugSet.push_back( plug ); 00126 } else { 00127 QMessageBox::information( NULL, 00128 "Plugin Load Error", 00129 "Could not import plugin" ); 00130 return; 00131 } 00132 00133 loadList(); 00134 toXMLFile( PLUGCFG_FNAME, "PluginConfig" ); 00135 loadMenu(); 00136 } 00137 00138 void PluginSet::rescanDir( ) { 00139 00140 } 00141 00142 void PluginSet::loadMenu( ) { 00143 if ( mMenuGroup ) { 00144 mMenuGroup->removeFrom( mMenuParent ); 00145 delete mMenuGroup; 00146 00147 } 00148 00149 mMenuGroup = new QActionGroup( mMenuParent ); 00150 00151 for ( int i=0; i < (int)mPlugSet.size(); i++ ) { 00152 ViewPopupAction *action = 00153 new ViewPopupAction( 00154 mPlugSet[i].getName().c_str(), 00155 mPlugSet[i].getName().c_str(), 00156 0, 00157 mMenuGroup ); 00158 // action->addTo( mMenuParent ); 00159 connect( action, 00160 SIGNAL( selected( ViewPopupAction* ) ), 00161 this, 00162 SLOT( pluginChosen( ViewPopupAction* ) ) ); 00163 } 00164 00165 mMenuGroup->addTo( mMenuParent ); 00166 } 00167 00168 void PluginSet::showPluginCfg( ) { 00169 this->show(); 00170 this->setFocus(); 00171 } 00172 00173 void PluginSet::loadList( ) { 00174 mPlugList->clear(); 00175 00176 for ( int i=0; i < (int)mPlugSet.size(); i++ ) { 00177 new QListViewItem( mPlugList, 00178 mPlugSet[i].getName().c_str(), 00179 mPlugSet[i].getFile().c_str() ); 00180 } 00181 } 00182 00183 void PluginSet::pluginChosen( ViewPopupAction *action ) { 00184 std::string name = (const char*)action->menuText(); 00185 if ( name == "" || mProj == NULL ) 00186 return; 00187 00188 int i=0; 00189 for ( ; i < (int)mPlugSet.size(); i++ ) { 00190 if ( name == mPlugSet[i].getName() ) 00191 break; 00192 } 00193 00194 if ( i >= (int)mPlugSet.size() ) 00195 return; 00196 00197 00198 mPlugSet[i].execPlugin( mProj ); 00199 00200 } 00201 00202 void PluginSet::selectedPluginChanged( QListViewItem *item ) { 00203 QListViewItem *selitem; 00204 int i=0; 00205 00206 selitem = mPlugList->firstChild(); 00207 while ( item != selitem && i < mPlugList->childCount() ) { 00208 i++; 00209 selitem = selitem->nextSibling(); 00210 } 00211 00212 if ( i >= mPlugList->childCount() && i < (int)mPlugSet.size() ) 00213 return; 00214 00215 mDescBox->setText( mPlugSet[i].getDesc().c_str() ); 00216 } 00217 00218 00219 00220
Home |
Search |
Disclaimers & Privacy |
Contact Us GLIMSView Maintainer: dsoltesz@usgs.gov |