kexi
kexiscriptpart.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "kexiscriptpart.h"
00023 #include "kexiscriptdesignview.h"
00024
00025 #include "kexiviewbase.h"
00026 #include "keximainwindow.h"
00027 #include "kexiproject.h"
00028
00029 #include <kross/main/manager.h>
00030 #include <kross/main/scriptaction.h>
00031 #include <kross/main/scriptguiclient.h>
00032
00033 #include <kgenericfactory.h>
00034 #include <kexipartitem.h>
00035 #include <kxmlguiclient.h>
00036 #include <kexidialogbase.h>
00037 #include <kconfig.h>
00038 #include <kdebug.h>
00039
00041 class KexiScriptPart::Private
00042 {
00043 public:
00044 Kross::Api::ScriptGUIClient* scriptguiclient;
00045 };
00046
00047 KexiScriptPart::KexiScriptPart(QObject *parent, const char *name, const QStringList &l)
00048 : KexiPart::Part(parent, name, l)
00049 , d( new Private() )
00050 {
00051 d->scriptguiclient = 0;
00052
00053
00054 m_registeredPartID = (int)KexiPart::ScriptObjectType;
00055
00056 m_names["instanceName"]
00057 = i18n("Translate this word using only lowercase alphanumeric characters (a..z, 0..9). "
00058 "Use '_' character instead of spaces. First character should be a..z character. "
00059 "If you cannot use latin characters in your language, use english word.",
00060 "script");
00061 m_names["instanceCaption"] = i18n("Script");
00062 m_supportedViewModes = Kexi::DesignViewMode;
00063 }
00064
00065 KexiScriptPart::~KexiScriptPart()
00066 {
00067 delete d->scriptguiclient;
00068 delete d;
00069 }
00070
00071 bool KexiScriptPart::execute(KexiPart::Item* item, QObject* sender)
00072 {
00073 Q_UNUSED(sender);
00074
00075 if(! item) {
00076 kdWarning() << "KexiScriptPart::execute: Invalid item." << endl;
00077 return false;
00078 }
00079
00080 KexiDialogBase* dialog = new KexiDialogBase(m_mainWin);
00081 dialog->setId( item->identifier() );
00082 KexiScriptDesignView* view = dynamic_cast<KexiScriptDesignView*>( createView(dialog, dialog, *item, Kexi::DesignViewMode) );
00083 if(! view) {
00084 kdWarning() << "KexiScriptPart::execute: Failed to create a view." << endl;
00085 return false;
00086 }
00087
00088 Kross::Api::ScriptAction* scriptaction = view->scriptAction();
00089 if(scriptaction) {
00090
00091 const QString dontAskAgainName = "askExecuteScript";
00092 KConfig* config = KGlobal::config();
00093 QString dontask = config->readEntry(dontAskAgainName).lower();
00094
00095 bool exec = (dontask == "yes");
00096 if( !exec && dontask != "no" ) {
00097 exec = KMessageBox::warningContinueCancel(0,
00098 i18n("Do you want to execute the script \"%1\"?\n\nScripts obtained from unknown sources can contain dangerous code.").arg(scriptaction->text()),
00099 i18n("Execute Script?"), KGuiItem(i18n("Execute"), "exec"),
00100 dontAskAgainName, KMessageBox::Notify | KMessageBox::Dangerous
00101 ) == KMessageBox::Continue;
00102 }
00103
00104 if(exec) {
00105
00106 d->scriptguiclient->executeScriptAction( scriptaction );
00107 }
00108 }
00109
00110 view->deleteLater();
00111 return true;
00112 }
00113
00114 void KexiScriptPart::initPartActions()
00115 {
00116 if(m_mainWin) {
00117
00118
00119
00120
00121 d->scriptguiclient = new Kross::Api::ScriptGUIClient( m_mainWin );
00122
00123
00124
00125
00126 if(! Kross::Api::Manager::scriptManager()->hasChild("KexiMainWindow")) {
00127 Kross::Api::Manager::scriptManager()->addQObject(m_mainWin, "KexiMainWindow");
00128
00129
00130
00131
00132 QPopupMenu* popup = m_mainWin->findPopupMenu("tools");
00133 if(popup) {
00134 KAction* execscriptaction = d->scriptguiclient->action("executescriptfile");
00135 if(execscriptaction)
00136 execscriptaction->plug( popup );
00137 KAction* configscriptaction = d->scriptguiclient->action("configurescripts");
00138 if(configscriptaction)
00139 configscriptaction->plug( popup );
00140 KAction* scriptmenuaction = d->scriptguiclient->action("installedscripts");
00141 if(scriptmenuaction)
00142 scriptmenuaction->plug( popup );
00143
00144
00145
00146
00147
00148
00149
00150
00151 }
00152 }
00153 }
00154 }
00155
00156 void KexiScriptPart::initInstanceActions()
00157 {
00158
00159 createSharedAction(Kexi::DesignViewMode, i18n("Configure Editor..."), "configure", 0, "script_config_editor");
00160 }
00161
00162 KexiViewBase* KexiScriptPart::createView(QWidget *parent, KexiDialogBase* dialog, KexiPart::Item& item, int viewMode, QMap<QString,QString>*)
00163 {
00164 QString partname = item.name();
00165 if( ! partname.isNull() ) {
00166 KexiMainWindow *win = dialog->mainWin();
00167 if(!win || !win->project() || !win->project()->dbConnection())
00168 return 0;
00169
00170 Kross::Api::ScriptActionCollection* collection = d->scriptguiclient->getActionCollection("projectscripts");
00171 if(! collection) {
00172 collection = new Kross::Api::ScriptActionCollection( i18n("Scripts"), d->scriptguiclient->actionCollection(), "projectscripts" );
00173 d->scriptguiclient->addActionCollection("projectscripts", collection);
00174 }
00175
00176 const char* name = partname.latin1();
00177 Kross::Api::ScriptAction::Ptr scriptaction = collection->action(name);
00178 if(! scriptaction) {
00179 scriptaction = new Kross::Api::ScriptAction(partname);
00180 collection->attach(scriptaction);
00181 }
00182
00183 if(viewMode == Kexi::DesignViewMode) {
00184 return new KexiScriptDesignView(win, parent, scriptaction);
00185 }
00186 }
00187 return 0;
00188 }
00189
00190 QString KexiScriptPart::i18nMessage(const QCString& englishMessage) const
00191 {
00192 if (englishMessage=="Design of object \"%1\" has been modified.")
00193 return i18n("Design of script \"%1\" has been modified.");
00194 if (englishMessage=="Object \"%1\" already exists.")
00195 return i18n("Script \"%1\" already exists.");
00196 return englishMessage;
00197 }
00198
00199 K_EXPORT_COMPONENT_FACTORY( kexihandler_script, KGenericFactory<KexiScriptPart>("kexihandler_script") )
00200
00201 #include "kexiscriptpart.moc"
|