00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <stdio.h>
00021
00022 #ifdef KDE_USE_FINAL
00023 #undef Always
00024 #include <qdir.h>
00025 #endif
00026 #include <qtable.h>
00027 #include <qpair.h>
00028
00029 #include <klibloader.h>
00030 #include <kaboutdata.h>
00031 #include <kstaticdeleter.h>
00032 #include <klocale.h>
00033 #include <kdebug.h>
00034 #include <kconfig.h>
00035
00036 #include "kjavaappletwidget.h"
00037 #include "kjavaappletviewer.h"
00038 #include "kjavaappletserver.h"
00039
00040
00041 K_EXPORT_COMPONENT_FACTORY (kjavaappletviewer, KJavaAppletViewerFactory)
00042
00043 KInstance *KJavaAppletViewerFactory::s_instance = 0;
00044
00045 KJavaAppletViewerFactory::KJavaAppletViewerFactory () {
00046 s_instance = new KInstance ("KJavaAppletViewer");
00047 }
00048
00049 KJavaAppletViewerFactory::~KJavaAppletViewerFactory () {
00050 delete s_instance;
00051 }
00052
00053 KParts::Part *KJavaAppletViewerFactory::createPartObject
00054 (QWidget *wparent, const char *wname,
00055 QObject *parent, const char * name, const char *, const QStringList & args) {
00056 return new KJavaAppletViewer (wparent, wname, parent, name, args);
00057 }
00058
00059
00060
00061 class KJavaServerMaintainer;
00062 static KJavaServerMaintainer * serverMaintainer = 0;
00063
00064 class KJavaServerMaintainer {
00065 public:
00066 KJavaServerMaintainer () { }
00067
00068 KJavaAppletContext * getContext (QObject*, const QString &);
00069 void releaseContext (QObject*, const QString &);
00070 public:
00071 typedef QMap <QPair <QObject*, QString>, QPair <KJavaAppletContext*, int> >
00072 ContextMap;
00073 ContextMap m_contextmap;
00074 };
00075
00076 KJavaAppletContext * KJavaServerMaintainer::getContext (QObject * w, const QString & doc) {
00077 ContextMap::key_type key = qMakePair (w, doc);
00078 ContextMap::iterator it = m_contextmap.find (key);
00079 if (it != m_contextmap.end ()) {
00080 (*it).second++;
00081 return (*it).first;
00082 }
00083 KJavaAppletContext * context = new KJavaAppletContext ();
00084 m_contextmap.insert (key, qMakePair(context, 1));
00085 return context;
00086 }
00087
00088 void KJavaServerMaintainer::releaseContext (QObject * w, const QString & doc) {
00089 ContextMap::iterator it = m_contextmap.find (qMakePair (w, doc));
00090 if (it != m_contextmap.end () && --(*it).second <= 0) {
00091 kdDebug(6100) << "KJavaServerMaintainer::releaseContext" << endl;
00092 (*it).first->deleteLater ();
00093 m_contextmap.remove (it);
00094 }
00095 }
00096
00097 static KStaticDeleter <KJavaServerMaintainer> serverMaintainerDeleter;
00098
00099
00100
00101 AppletParameterDialog::AppletParameterDialog (KJavaAppletWidget * parent)
00102
00103 : KDialogBase (parent, "paramdialog", true, "Applet Parameters",
00104 KDialogBase::Close, KDialogBase::Close, true),
00105 m_appletWidget (parent) {
00106 KJavaApplet * applet = parent->applet ();
00107 table = new QTable (30, 2, this);
00108 table->setMinimumSize (QSize (600, 400));
00109 table->setColumnWidth (0, 200);
00110 table->setColumnWidth (1, 340);
00111 QHeader *header = table->horizontalHeader();
00112
00113 header->setLabel (0, "Parameter");
00114
00115 header->setLabel (1, "Value");
00116
00117 QTableItem * tit = new QTableItem (table, QTableItem::Never, "Class");
00118 table->setItem (0, 0, tit);
00119 tit = new QTableItem(table, QTableItem::Always, applet->appletClass());
00120 table->setItem (0, 1, tit);
00121
00122 tit = new QTableItem (table, QTableItem::Never, "Base URL");
00123 table->setItem (1, 0, tit);
00124 tit = new QTableItem(table, QTableItem::Always, applet->baseURL());
00125 table->setItem (1, 1, tit);
00126
00127 tit = new QTableItem (table, QTableItem::Never, "Archives");
00128 table->setItem (2, 0, tit);
00129 tit = new QTableItem(table, QTableItem::Always, applet->archives());
00130 table->setItem (2, 1, tit);
00131 QMap<QString,QString>::iterator it = applet->getParams().begin ();
00132 for (int count = 2; it != applet->getParams().end (); ++it) {
00133 tit = new QTableItem (table, QTableItem::Always, it.key ());
00134 table->setItem (++count, 0, tit);
00135 tit = new QTableItem(table, QTableItem::Always, it.data ());
00136 table->setItem (count, 1, tit);
00137 }
00138 setMainWidget (table);
00139 }
00140
00141 void AppletParameterDialog::slotClose () {
00142 table->selectCells (0, 0, 0, 0);
00143 KJavaApplet * applet = m_appletWidget->applet ();
00144 applet->setAppletClass (table->item (0, 1)->text ());
00145 applet->setBaseURL (table->item (1, 1)->text ());
00146 applet->setArchives (table->item (2, 1)->text ());
00147 for (int i = 3; i < table->numRows (); ++i) {
00148 if (table->item (i, 0) && table->item (i, 1) && !table->item (i, 0)->text ().isEmpty ())
00149 applet->setParameter (table->item (i, 0)->text (),
00150 table->item (i, 1)->text ());
00151 }
00152 hide ();
00153 }
00154
00155
00156 KJavaAppletViewer::KJavaAppletViewer (QWidget * wparent, const char *,
00157 QObject * parent, const char * name, const QStringList & args)
00158 : KParts::ReadOnlyPart (parent, name),
00159 m_browserextension (new KJavaAppletViewerBrowserExtension (this))
00160 {
00161 if (!serverMaintainer) {
00162 serverMaintainerDeleter.setObject (serverMaintainer,
00163 new KJavaServerMaintainer);
00164 }
00165 m_view = new KJavaAppletViewerWidget (wparent);
00166
00167 QString classname, classid, codebase, khtml_codebase;
00168 int width = -1;
00169 int height = -1;
00170 KJavaApplet * applet = m_view->applet ();
00171 QStringList::const_iterator it = args.begin ();
00172 for ( ; it != args.end (); ++it) {
00173 int equalPos = (*it).find("=");
00174 if (equalPos > 0) {
00175 QString name = (*it).left (equalPos).upper ();
00176 QString value = (*it).right ((*it).length () - equalPos - 1);
00177 if (value.at(0)=='\"')
00178 value = value.right (value.length () - 1);
00179 if (value.at (value.length () - 1) == '\"')
00180 value.truncate (value.length () - 1);
00181 kdDebug(6100) << "name=" << name << " value=" << value << endl;
00182 if (!name.isEmpty()) {
00183 QString name_lower = name.lower ();
00184 if (name == "__KHTML__PLUGINBASEURL") {
00185 KURL url (value);
00186 QString fn = url.fileName (false);
00187 baseurl = fn.isEmpty () ?
00188 value : value.left (value.length ()-fn.length ());
00189 } else if (name == "__KHTML__CODEBASE") {
00190 khtml_codebase = value;
00191 } else if (name_lower == QString::fromLatin1("codebase") ||
00192 name_lower == QString::fromLatin1("java_codebase")) {
00193 if (!value.isEmpty ())
00194 codebase = value;
00195 } else if (name == "__KHTML__CLASSID")
00196
00197 classid = value;
00198 else if (name_lower == QString::fromLatin1("code") ||
00199 name_lower == QString::fromLatin1("java_code") ||
00200 name_lower == QString::fromLatin1("src"))
00201 classname = value;
00202 else if (name_lower == QString::fromLatin1("archive") ||
00203 name_lower == QString::fromLatin1("java_archieve"))
00204 applet->setArchives (value);
00205 else if (name_lower == QString::fromLatin1("name"))
00206 applet->setAppletName (value);
00207 else if (name_lower == QString::fromLatin1("width"))
00208 width = value.toInt();
00209 else if (name_lower == QString::fromLatin1("height"))
00210 height = value.toInt();
00211 else {
00212 applet->setParameter (name, value);
00213 }
00214 }
00215 }
00216 }
00217 if (!classid.isEmpty ()) {
00218 applet->setParameter ("CLSID", classid);
00219 kdDebug(6100) << "classid=" << classid << classid.startsWith("clsid:")<< endl;
00220 if (classid.startsWith ("clsid:"))
00221
00222 khtml_codebase = baseurl;
00223 else if (classname.isEmpty () && classid.startsWith ("java:"))
00224 classname = classid.mid(5);
00225 }
00226 if (codebase.isEmpty ())
00227 codebase = khtml_codebase;
00228
00229 if (width > 0 && height > 0)
00230 applet->setSize (QSize(width, height));
00231 applet->setBaseURL (baseurl);
00232 applet->setCodeBase (codebase);
00233 applet->setAppletClass (classname);
00234 applet->setAppletContext (serverMaintainer->getContext (parent, baseurl));
00235
00236 setInstance (KJavaAppletViewerFactory::instance ());
00237 KParts::Part::setWidget (m_view);
00238 insertChild (applet->getLiveConnectExtension ());
00239
00240 connect (applet->getContext(), SIGNAL(appletLoaded()), this, SLOT(appletLoaded()));
00241 connect (applet->getContext(), SIGNAL(showDocument(const QString&, const QString&)), m_browserextension, SLOT(showDocument(const QString&, const QString&)));
00242 connect (applet->getContext(), SIGNAL(showStatus(const QString &)), this, SLOT(infoMessage(const QString &)));
00243 }
00244
00245 KJavaAppletViewer::~KJavaAppletViewer () {
00246 delete m_view;
00247 serverMaintainer->releaseContext (parent(), baseurl);
00248 delete m_browserextension;
00249 }
00250
00251 bool KJavaAppletViewer::openURL (const KURL & url) {
00252 if (!m_view) return false;
00253 KJavaApplet * applet = m_view->applet ();
00254 if (applet->isCreated ())
00255 applet->stop ();
00256 if (applet->appletClass ().isEmpty ()) {
00257
00258 if (applet->baseURL ().isEmpty ()) {
00259 applet->setAppletClass (url.fileName ());
00260 applet->setBaseURL (url.upURL ().url ());
00261 } else
00262 applet->setAppletClass (url.url ());
00263 AppletParameterDialog (m_view).exec ();
00264 applet->setSize (m_view->sizeHint());
00265 }
00266
00267 if (applet->size().width() > 0 || m_view->isVisible())
00268 m_view->showApplet ();
00269 emit started (0L);
00270 return url.isValid ();
00271 }
00272
00273 bool KJavaAppletViewer::openFile () {
00274 return false;
00275 }
00276
00277 void KJavaAppletViewer::appletLoaded () {
00278 KJavaApplet * applet = m_view->applet ();
00279 if (applet->isAlive() || applet->failed())
00280 emit completed();
00281 }
00282
00283 void KJavaAppletViewer::infoMessage (const QString & msg) {
00284 m_browserextension->infoMessage(msg);
00285 }
00286
00287 KAboutData* KJavaAppletViewer::createAboutData () {
00288
00289 return new KAboutData("KJavaAppletViewer", "KDE Java Applet Plugin", "1.0");
00290 }
00291
00292
00293
00294 KJavaAppletViewerBrowserExtension::KJavaAppletViewerBrowserExtension (KJavaAppletViewer * parent)
00295 : KParts::BrowserExtension (parent, "KJavaAppletViewer Browser Extension") {
00296 }
00297
00298 void KJavaAppletViewerBrowserExtension::urlChanged (const QString & url) {
00299 emit setLocationBarURL (url);
00300 }
00301
00302 void KJavaAppletViewerBrowserExtension::setLoadingProgress (int percentage) {
00303 emit loadingProgress (percentage);
00304 }
00305
00306 void KJavaAppletViewerBrowserExtension::setURLArgs (const KParts::URLArgs & ) {
00307 }
00308
00309 void KJavaAppletViewerBrowserExtension::saveState (QDataStream & stream) {
00310 KJavaApplet * applet = static_cast<KJavaAppletViewer*>(parent())->view()->applet ();
00311 stream << applet->appletClass();
00312 stream << applet->baseURL();
00313 stream << applet->archives();
00314 stream << applet->getParams().size ();
00315 QMap<QString,QString>::iterator it = applet->getParams().begin ();
00316 for ( ; it != applet->getParams().end (); ++it) {
00317 stream << it.key ();
00318 stream << it.data ();
00319 }
00320 }
00321
00322 void KJavaAppletViewerBrowserExtension::restoreState (QDataStream & stream) {
00323 KJavaAppletViewer * viewer = static_cast<KJavaAppletViewer*>(parent());
00324 KJavaApplet * applet = viewer->view()->applet ();
00325 QString key, val;
00326 int paramcount;
00327 stream >> val;
00328 applet->setAppletClass (val);
00329 stream >> val;
00330 applet->setBaseURL (val);
00331 stream >> val;
00332 applet->setArchives (val);
00333 stream >> paramcount;
00334 for (int i = 0; i < paramcount; ++i) {
00335 stream >> key;
00336 stream >> val;
00337 applet->setParameter (key, val);
00338 kdDebug(6100) << "restoreState key:" << key << " val:" << val << endl;
00339 }
00340 applet->setSize (viewer->view ()->sizeHint ());
00341 if (viewer->view ()->isVisible())
00342 viewer->view ()->showApplet ();
00343 }
00344
00345 void KJavaAppletViewerBrowserExtension::showDocument (const QString & doc,
00346 const QString & frame) {
00347 KURL url (doc);
00348 KParts::URLArgs args;
00349 args.frameName = frame;
00350 emit openURLRequest (url, args);
00351 }
00352
00353
00354
00355
00356 KJavaAppletViewerWidget::KJavaAppletViewerWidget(QWidget* parent, const char* name)
00357 : KJavaAppletWidget(parent, name) {}
00358
00359 void KJavaAppletViewerWidget::showEvent (QShowEvent * e) {
00360 KJavaAppletWidget::showEvent(e);
00361 if (!applet()->isCreated() && !applet()->appletClass().isEmpty()) {
00362
00363 if (applet()->size().width() <= 0)
00364 applet()->setSize (sizeHint());
00365 showApplet();
00366 }
00367 }
00368
00369 #include "kjavaappletviewer.moc"