5 #include <tqpopupmenu.h> 10 #include <tqradiobutton.h> 11 #include <tqcheckbox.h> 14 #include <kmimetype.h> 17 #include <tdeapplication.h> 20 #include <tdelocale.h> 21 #include <tdemessagebox.h> 22 #include <tdeparts/part.h> 23 #include <tdeparts/factory.h> 24 #include <tdeparts/partmanager.h> 25 #include <tdeparts/browserextension.h> 26 #include <tdefiledialog.h> 27 #include <tdemainwindow.h> 28 #include <tdeaction.h> 29 #include <tdemessagebox.h> 30 #include <kstatusbar.h> 31 #include <tdehtml_part.h> 32 #include <tdepopupmenu.h> 33 #include <tdeio/netaccess.h> 34 #include <kdialogbase.h> 35 #include <klineedit.h> 36 #include <tdeshortcut.h> 37 #include <kcompletion.h> 38 #include <kdirwatch.h> 39 #include <tdeversion.h> 40 #include <kiconloader.h> 41 #include <kuserprofile.h> 42 #include <kencodingfiledialog.h> 43 #include <ksqueezedtextlabel.h> 45 #include <tdetexteditor/view.h> 46 #include <tdetexteditor/document.h> 47 #include <tdetexteditor/viewcursorinterface.h> 48 #include <tdetexteditor/encodinginterface.h> 53 #include "editorproxy.h" 54 #include "documentationpart.h" 55 #include "ksavealldialog.h" 57 #include "kdevproject.h" 59 #include "mimewarningdialog.h" 61 #include "kdevjobtimer.h" 64 #include "kdevlanguagesupport.h" 66 #include "multibuffer.h" 67 #include "partcontroller.h" 81 HistoryEntry(
const KURL& u,
const TQString& c ): url( u ), context( c ) {}
84 struct ModificationData
86 KTextEditor::Document * doc;
92 PartController::PartController(TQWidget *parent)
93 : KDevPartController(parent), _editorFactory(0L), m_currentActivePart(0), m_removingActivePart(false)
95 connect(
this, TQT_SIGNAL(partRemoved(KParts::Part*)),
this, TQT_SLOT(slotPartRemoved(KParts::Part* )) );
96 connect(
this, TQT_SIGNAL(partAdded(KParts::Part*)),
this, TQT_SLOT(slotPartAdded(KParts::Part* )) );
97 connect(
this, TQT_SIGNAL(activePartChanged(KParts::Part*)),
this, TQT_SLOT(slotActivePartChanged(KParts::Part*)));
103 m_openNextAsText =
false;
107 PartController::~PartController()
112 void PartController::createInstance(TQWidget *parent)
125 void PartController::setupActions()
129 TDEAction* newAction = KStdAction::open(
this, TQT_SLOT(slotOpenFile()), ac,
"file_open");
130 newAction->setToolTip( i18n(
"Open file") );
131 newAction->setWhatsThis( i18n(
"<b>Open file</b><p>Opens an existing file without adding it to the project.</p>") );
133 m_openRecentAction = KStdAction::openRecent(
this, TQT_SLOT(slotOpenRecent(
const KURL&) ), ac,
"file_open_recent" );
134 m_openRecentAction->setWhatsThis(TQString(
"<b>%1</b><p>%2").arg(beautifyToolTip(m_openRecentAction->text())).arg(i18n(
"Opens recently opened file.")));
135 m_openRecentAction->loadEntries( kapp->config(),
"RecentFiles" );
137 m_saveAllFilesAction =
new TDEAction(i18n(
"Save Al&l"), 0,
this, TQT_SLOT(slotSaveAllFiles()), ac,
"file_save_all");
138 m_saveAllFilesAction->setToolTip( i18n(
"Save all modified files") );
139 m_saveAllFilesAction->setWhatsThis(i18n(
"<b>Save all</b><p>Saves all modified files."));
140 m_saveAllFilesAction->setEnabled(
false);
142 m_revertAllFilesAction =
new TDEAction(i18n(
"Rever&t All"), 0,
this, TQT_SLOT(slotRevertAllFiles()), ac,
"file_revert_all");
143 m_revertAllFilesAction->setToolTip(i18n(
"Revert all changes"));
144 m_revertAllFilesAction->setWhatsThis(i18n(
"<b>Revert all</b><p>Reverts all changes in opened files. Prompts to save changes so the reversion can be canceled for each modified file."));
145 m_revertAllFilesAction->setEnabled(
false);
147 m_closeWindowAction = KStdAction::close(
this, TQT_SLOT(slotCloseWindow()), ac,
"file_close");
148 m_closeWindowAction->setToolTip( i18n(
"Close current file") );
149 m_closeWindowAction->setWhatsThis(TQString(
"<b>%1</b><p>%2").arg(beautifyToolTip(m_closeWindowAction->text())).arg(i18n(
"Closes current file.")));
150 m_closeWindowAction->setEnabled(
false);
152 m_closeAllWindowsAction =
new TDEAction(i18n(
"Close All"), 0,
this, TQT_SLOT(slotCloseAllWindows()), ac,
"file_close_all");
153 m_closeAllWindowsAction->setToolTip( i18n(
"Close all files") );
154 m_closeAllWindowsAction->setWhatsThis(i18n(
"<b>Close all</b><p>Close all opened files."));
155 m_closeAllWindowsAction->setEnabled(
false);
157 m_closeOtherWindowsAction =
new TDEAction(i18n(
"Close All Others"), 0,
this, TQT_SLOT(slotCloseOtherWindows()), ac,
"file_closeother");
158 m_closeOtherWindowsAction->setToolTip( i18n(
"Close other files") );
159 m_closeOtherWindowsAction->setWhatsThis(i18n(
"<b>Close all others</b><p>Close all opened files except current."));
160 m_closeOtherWindowsAction->setEnabled(
false);
162 new TDEActionSeparator(ac,
"dummy_separator");
164 m_backAction =
new TDEToolBarPopupAction(i18n(
"Back"),
"back", 0,
this, TQT_SLOT(slotBack()), ac,
"history_back");
165 m_backAction->setEnabled(
false );
166 m_backAction->setToolTip(i18n(
"Back"));
167 m_backAction->setWhatsThis(i18n(
"<b>Back</b><p>Moves backwards one step in the navigation history."));
168 connect(m_backAction->popupMenu(), TQT_SIGNAL(aboutToShow()),
this, TQT_SLOT(slotBackAboutToShow()));
169 connect(m_backAction->popupMenu(), TQT_SIGNAL(activated(
int)),
this, TQT_SLOT(slotBackPopupActivated(
int)));
171 m_forwardAction =
new TDEToolBarPopupAction(i18n(
"Forward"),
"forward", 0,
this, TQT_SLOT(slotForward()), ac,
"history_forward");
172 m_forwardAction->setEnabled(
false );
173 m_forwardAction->setToolTip(i18n(
"Forward"));
174 m_forwardAction->setWhatsThis(i18n(
"<b>Forward</b><p>Moves forward one step in the navigation history."));
175 connect(m_forwardAction->popupMenu(), TQT_SIGNAL(aboutToShow()),
this, TQT_SLOT(slotForwardAboutToShow()));
176 connect(m_forwardAction->popupMenu(), TQT_SIGNAL(activated(
int)),
this, TQT_SLOT(slotForwardPopupActivated(
int)));
178 m_gotoLastEditPosAction =
new TDEAction( i18n(
"Goto Last Edit Position"),
"go-bottom", 0,
this, TQT_SLOT(gotoLastEditPos()), ac,
"goto_last_edit_pos" );
179 m_gotoLastEditPosAction->setEnabled(
false );
180 m_gotoLastEditPosAction->setToolTip( i18n(
"Goto Last Edit Position") );
181 m_gotoLastEditPosAction->setWhatsThis( i18n(
"<b>Goto Last Edit Position</b><p>Open the last edited file and position cursor at the point of edit") );
184 void PartController::setEncoding(
const TQString &encoding)
186 m_presetEncoding = encoding;
189 KParts::Part* PartController::findOpenDocument(
const KURL& url)
192 KParts::Part * part = partForURL( url );
199 if ( API::getInstance()->project() )
201 KURL partURL = findURLInProject( url );
203 return partForURL( partURL );
209 KURL PartController::findURLInProject(
const KURL& url)
211 TQStringList fileList = API::getInstance()->project()->allFiles();
213 bool filenameOnly = (url.url().find(
'/') == -1);
214 TQString filename = filenameOnly ?
"/" :
"";
215 filename += url.url();
217 for (TQStringList::Iterator it = fileList.begin(); it != fileList.end(); ++it) {
218 if ((*it).endsWith(filename)) {
220 return KURL( API::getInstance()->project()->projectDirectory() +
"/" + *it );
227 void PartController::editDocument(
const KURL &inputUrl,
int lineNum,
int col)
229 editDocumentInternal(inputUrl, lineNum, col);
232 void PartController::splitCurrentDocument(
const KURL &inputUrl,
233 int lineNum,
int col)
235 editDocumentInternal(inputUrl, lineNum, col,
true,
true);
238 void PartController::scrollToLineColumn(
const KURL &inputUrl,
239 int lineNum,
int col,
bool storeHistory )
241 if ( KParts::ReadOnlyPart *existingPart = partForURL( inputUrl ) )
243 if( storeHistory ) addHistoryEntry( existingPart );
244 EditorProxy::getInstance()->setLineNumber( existingPart, lineNum, col );
249 void PartController::editDocumentInternal(
const KURL & inputUrl,
int lineNum,
250 int col,
bool activate,
251 bool addToCurrentBuffer )
253 kdDebug(9000) << k_funcinfo <<
"\n " << inputUrl.prettyURL()
254 <<
" linenum " << lineNum <<
" activate? " << activate
255 <<
" addToCurrentBuffer? " << addToCurrentBuffer << endl;
261 if ( KParts::Part *existingPart = partForURL( url ) )
264 if ( !m_presetEncoding.isNull() )
266 if ( KTextEditor::EncodingInterface * ei = dynamic_cast<KTextEditor::EncodingInterface*>( existingPart ) )
268 ei->setEncoding( m_presetEncoding );
270 m_presetEncoding = TQString();
274 activatePart( existingPart );
275 EditorProxy::getInstance()->setLineNumber( existingPart, lineNum, col );
280 if ( !url.isValid() || !TDEIO::NetAccess::exists(url,
false, 0) )
285 if ( API::getInstance()->project() )
287 if (url.isRelativeURL(url.url())) {
288 KURL relURL(API::getInstance()->project()->projectDirectory());
289 relURL.addPath( url.url() );
291 kdDebug() << k_funcinfo <<
"Looking for file in project dir: " << API::getInstance()->project()->projectDirectory() <<
" url " << url.url() <<
" transformed to " << relURL.url() <<
": " << done << endl;
292 if (relURL.isValid() && TDEIO::NetAccess::exists(relURL,
false, 0)) {
297 KURL relURL(API::getInstance()->project()->buildDirectory());
298 relURL.addPath( url.url() );
299 kdDebug() << k_funcinfo <<
"Looking for file in build dir: " << API::getInstance()->project()->buildDirectory() <<
" url " << url.url() <<
" transformed to " << relURL.url() <<
": " << done << endl;
300 if (relURL.isValid() && TDEIO::NetAccess::exists(relURL,
false, 0)) {
308 url = findURLInProject(url);
310 if ( !url.isValid() || !TDEIO::NetAccess::exists(url,
false, 0) )
312 url = API::getInstance()->project()->projectDirectory() +
"/" + url.path();
319 if ( !done && ( !url.isValid() || !TDEIO::NetAccess::exists(url,
false, 0) ))
322 kdDebug(9000) <<
"cannot find URL: " << url.url() << endl;
331 if (url.isLocalFile())
333 TQString path = url.path();
334 path = URLUtil::canonicalPath(path);
335 if ( !path.isEmpty() )
340 KParts::Part *existingPart = partForURL(url);
344 activatePart(existingPart);
345 EditorProxy::getInstance()->setLineNumber(existingPart, lineNum, col);
349 if ( !addToCurrentBuffer )
351 if ( KDevLanguageSupport *lang =
352 API::getInstance()->languageSupport() )
356 addToCurrentBuffer = lang->shouldSplitDocument( inputUrl );
358 if ( addToCurrentBuffer )
361 "languagePart() insists addToCurrentBuffer = true" << endl;
370 KMimeType::Ptr MimeType = KMimeType::findByURL( url );
372 kdDebug(9000) <<
"mimeType = " << MimeType->name() << endl;
375 if ( MimeType->is(
"inode/directory" ) )
380 if ( !m_presetEncoding.isNull() )
382 m_openNextAsText =
true;
385 TDEConfig *config = kapp->config();
386 config->setGroup(
"General Options");
389 if ( !m_openNextAsText && MimeType->is(
"application/x-designer" ) )
391 TQString DesignerSetting = config->readEntry(
"DesignerSetting",
"ExternalDesigner" );
392 TQString designerExec =
"designer";
393 TQStringList designerPluginPaths;
394 TQDomDocument* dom = API::getInstance()->projectDom();
400 if ( DomUtil::readIntEntry( *dom,
"/kdevcppsupport/qt/version", 3 ) == 4 )
402 designerPluginPaths = DomUtil::readListEntry(*dom,
"/kdevcppsupport/qt/designerpluginpaths",
"path" );
403 DesignerSetting =
"ExternalDesigner";
406 DesignerSetting = DomUtil::readEntry(*dom,
"/kdevcppsupport/qt/designerintegration", DesignerSetting );
407 designerExec = DomUtil::readEntry(*dom,
"/kdevcppsupport/qt/designer", designerExec );
409 if ( DesignerSetting ==
"ExternalKDevDesigner" )
411 designerExec =
"kdevdesigner";
413 else if ( DesignerSetting ==
"EmbeddedKDevDesigner" )
415 if ( KParts::ReadOnlyPart *designerPart = qtDesignerPart() )
418 activatePart(designerPart);
419 designerPart->openURL(url);
422 else if ( KParts::Factory * KDevDesignerFactory = static_cast<KParts::Factory*>( KLibLoader::self()->factory( TQFile::encodeName(
"libkdevdesignerpart" ) ) ) )
424 KParts::ReadWritePart * kdevpart =
static_cast<KParts::ReadWritePart*
>( KDevDesignerFactory->createPart(
TopLevel::getInstance()->main(), 0, 0, 0,
"KParts::ReadWritePart" ) );
425 kdevpart->openURL( url );
427 integratePart( kdevpart, url );
428 m_openRecentAction->addURL( url );
429 m_openRecentAction->saveEntries( kapp->config(),
"RecentFiles" );
434 if( designerPluginPaths.isEmpty() )
435 KRun::runCommand( designerExec+
" "+url.pathOrURL() );
437 KRun::runCommand(
"TQT_PLUGIN_PATH=\""+designerPluginPaths.join(
":")+
"\" "+designerExec+
" "+url.pathOrURL() );
442 config->setGroup(
"General");
444 TQStringList texttypeslist = config->readListEntry(
"TextTypes" );
445 if ( texttypeslist.contains( MimeType->name() ) )
447 m_openNextAsText =
true;
451 TQVariant v = MimeType->property(
"X-TDE-text");
455 if ( m_openNextAsText || isText || MimeType->is(
"application/x-zerosize" ) )
457 KTextEditor::Editor *editorpart =
458 createEditorPart( activate, addToCurrentBuffer, url );
461 if ( m_presetEncoding.isNull() && API::getInstance()->projectDom() )
463 TQDomDocument * projectDom = API::getInstance()->projectDom();
464 m_presetEncoding = DomUtil::readEntry( *projectDom,
"/general/defaultencoding", TQString() );
467 if ( !m_presetEncoding.isNull() )
469 if ( KTextEditor::EncodingInterface * ei = dynamic_cast<KTextEditor::EncodingInterface*>( editorpart ) )
471 ei->setEncoding( m_presetEncoding );
473 m_presetEncoding = TQString();
478 TQWidget * widget = EditorProxy::getInstance()->topWidgetForPart( editorpart );
480 integratePart(editorpart, url, widget,
true, activate, addToCurrentBuffer);
481 EditorProxy::getInstance()->setLineNumber(editorpart, lineNum, col);
483 m_openNextAsText =
false;
485 m_openRecentAction->addURL( url );
486 m_openRecentAction->saveEntries( kapp->config(),
"RecentFiles" );
494 KParts::Factory *factory = 0;
497 TQString services[] = {
"KParts/ReadWritePart",
"KParts/ReadOnlyPart" };
498 TQString classnames[] = {
"KParts::ReadWritePart",
"KParts::ReadOnlyPart" };
499 for (uint i=0; i<2; ++i)
501 factory = findPartFactory( MimeType->name(), services[i] );
504 className = classnames[i];
509 kdDebug(9000) <<
"factory = " << factory << endl;
514 KParts::ReadOnlyPart *part =
static_cast<KParts::ReadOnlyPart*
>( factory->createPart(
TopLevel::getInstance()->main(), 0, 0, 0, className.latin1() ) );
517 part->openURL( url );
520 if ( dynamic_cast<KTextEditor::Editor*>( part ) )
522 integratePart(part, url, part->widget(),
true, activate);
523 EditorProxy::getInstance()->setLineNumber(part, lineNum, col);
527 integratePart( part, url );
530 m_openRecentAction->addURL( url );
531 m_openRecentAction->saveEntries( kapp->config(),
"RecentFiles" );
536 MimeWarningDialog dlg;
537 dlg.text2->setText( TQString(
"<qt><b>%1</b></qt>" ).arg(url.path()));
538 dlg.text3->setText( dlg.text3->text().arg(MimeType->name()) );
540 if ( dlg.exec() == TQDialog::Accepted )
542 if ( dlg.open_with_kde->isChecked() )
544 KRun::runURL(url, MimeType->name() );
548 if ( dlg.always_open_as_text->isChecked() )
550 TDEConfig *config = kapp->config();
551 config->setGroup(
"General");
552 TQStringList texttypeslist = config->readListEntry(
"TextTypes" );
553 texttypeslist << MimeType->name();
554 config->writeEntry(
"TextTypes", texttypeslist );
556 m_openNextAsText =
true;
557 editDocument( url, lineNum, col );
564 void PartController::showDocument(
const KURL &url,
bool newWin)
566 TQString fixedPath = HTMLDocumentationPart::resolveEnvVarsInURL(url.url());
567 KURL docUrl(fixedPath);
568 kdDebug(9000) <<
"SHOW: " << docUrl.url() << endl;
570 if ( docUrl.isLocalFile() && KMimeType::findByURL(docUrl)->name() !=
"text/html" ) {
573 editDocument( docUrl );
583 integratePart(part,docUrl);
584 connect(part, TQT_SIGNAL(fileNameChanged(KParts::ReadOnlyPart* )),
585 this, TQT_SIGNAL(partURLChanged(KParts::ReadOnlyPart* )));
591 part->openURL(docUrl);
594 KParts::Factory *PartController::findPartFactory(
const TQString &mimeType,
const TQString &partType,
const TQString &preferredName)
596 TDETrader::OfferList offers = TDETrader::self()->query(mimeType, TQString(
"'%1' in ServiceTypes").arg(partType));
598 if (offers.count() > 0)
600 KService::Ptr ptr = 0;
602 if ( !preferredName.isEmpty() ) {
603 TDETrader::OfferList::Iterator it;
604 for (it = offers.begin(); it != offers.end(); ++it) {
605 if ((*it)->desktopEntryName() == preferredName) {
612 ptr = offers.first();
614 return static_cast<KParts::Factory*
>(KLibLoader::self()->factory(TQFile::encodeName(ptr->library())));
620 KTextEditor::Editor * PartController::createEditorPart(
bool activate,
621 bool addToCurrentBuffer,
624 MultiBuffer *multiBuffer = 0;
625 if ( addToCurrentBuffer )
628 dynamic_cast<MultiBuffer*
>(
629 EditorProxy::getInstance()->topWidgetForPart( activePart() )
634 kdDebug(9000) <<
"Creating a new MultiBuffer for " 635 << url.fileName() << endl;
639 static bool alwaysActivate =
true;
641 kapp->config()->setGroup(
"Editor");
642 TQString preferred = kapp->config()->readPathEntry(
"EmbeddedKTextEditor");
646 if ( preferred !=
"kyzispart" )
647 alwaysActivate =
false;
649 KTextEditor::Editor *editorpart =
650 dynamic_cast<KTextEditor::Editor*
>(multiBuffer->createPart(
"text/plain",
651 "KTextEditor/Document",
652 alwaysActivate | activate ?
653 "KTextEditor::Editor" :
"KTextEditor::Document",
658 editorpart->openURL( url );
660 multiBuffer->registerURL( url, editorpart );
661 multiBuffer->setDelayedActivation( !activate );
665 void PartController::integratePart(KParts::Part *part,
const KURL &url,
666 TQWidget* widget,
bool isTextEditor,
667 bool activate,
bool addToCurrentBuffer )
669 if (!widget) widget = part->widget();
673 kdDebug(9000) <<
"no widget for this part!!" << endl;
677 if ( !addToCurrentBuffer )
680 addPart(part, activate);
683 KParts::ReadOnlyPart *ro_part =
dynamic_cast<KParts::ReadOnlyPart*
>(part);
684 if ( !ro_part )
return;
686 emit loadedFile( ro_part->url() );
688 connect( part, TQT_SIGNAL(modifiedOnDisc(Kate::Document*,
bool,
unsigned char)),
this, TQT_SLOT(slotDocumentDirty(Kate::Document*,
bool,
unsigned char)) );
691 connect(part, TQT_SIGNAL(completed()),
this, TQT_SLOT(slotUploadFinished()));
701 integrateTextEditorPart(static_cast<KTextEditor::Document*>(part));
703 KInterfaceDesigner::Designer *designerPart =
dynamic_cast<KInterfaceDesigner::Designer *
>(part);
704 if (designerPart && API::getInstance()->languageSupport())
706 kdDebug() <<
"integrating designer part with language support" << endl;
707 connect(designerPart, TQT_SIGNAL(addedFunction(DesignerType,
const TQString&, Function )),
708 API::getInstance()->languageSupport(),
709 TQT_SLOT(addFunction(DesignerType,
const TQString&, Function )));
710 connect(designerPart, TQT_SIGNAL(editedFunction(DesignerType,
const TQString&, Function, Function )), API::getInstance()->languageSupport(),
711 TQT_SLOT(editFunction(DesignerType,
const TQString&, Function, Function )));
712 connect(designerPart, TQT_SIGNAL(removedFunction(DesignerType,
const TQString&, Function )),
713 API::getInstance()->languageSupport(),
714 TQT_SLOT(removeFunction(DesignerType,
const TQString&, Function )));
715 connect(designerPart, TQT_SIGNAL(editFunction(DesignerType,
const TQString&,
const TQString& )),
716 API::getInstance()->languageSupport(),
717 TQT_SLOT(openFunction(DesignerType,
const TQString&,
const TQString& )));
718 connect(designerPart, TQT_SIGNAL(editSource(DesignerType,
const TQString& )),
719 API::getInstance()->languageSupport(),
720 TQT_SLOT(openSource(DesignerType,
const TQString& )));
721 connect(designerPart, TQT_SIGNAL(newStatus(
const TQString &,
int)),
722 this, TQT_SLOT(slotNewDesignerStatus(
const TQString &,
int)));
726 void PartController::integrateTextEditorPart(KTextEditor::Document* doc)
743 connect( doc, TQT_SIGNAL(textChanged()),
this, TQT_SLOT(textChanged()) );
744 connect( doc, TQT_SIGNAL(fileNameChanged()),
745 this, TQT_SLOT(slotDocumentUrlChanged()));
749 connect( doc->widget(), TQT_SIGNAL(dropEventPass(TQDropEvent *)),
753 if ( KTextEditor::View * view = dynamic_cast<KTextEditor::View*>( doc->widget() ) )
755 TDEActionCollection* c = view->actionCollection();
759 if (TDEAction* a = c->action(
"view_folding_markers"))
761 if (a->shortcut() == TDEShortcut(Key_F9))
762 a->setShortcut(TDEShortcut());
765 if (TDEAction* a = c->action(
"view_dynamic_word_wrap"))
767 if (a->shortcut() == TDEShortcut(Key_F10))
768 a->setShortcut(TDEShortcut());
771 if (TDEAction* a = c->action(
"view_line_numbers"))
773 if (a->shortcut() == TDEShortcut(Key_F11))
774 a->setShortcut(TDEShortcut());
786 TQPtrList<KTextEditor::View> list = doc->views();
787 TQPtrListIterator<KTextEditor::View> it( list );
788 while ( it.current() )
790 connect( it, TQT_SIGNAL( newStatus() ),
this, TQT_SLOT( slotNewStatus() ) );
795 void PartController::slotPartAdded( KParts::Part * part )
797 kdDebug(9000) << k_funcinfo << endl;
799 if ( KParts::ReadOnlyPart * ro_part = dynamic_cast<KParts::ReadOnlyPart*>( part ) )
801 updatePartURL( ro_part );
807 void PartController::slotPartRemoved( KParts::Part * part )
809 kdDebug(9000) << k_funcinfo << endl;
811 _partURLMap.remove( static_cast<KParts::ReadOnlyPart*>(part) );
813 if ( part == m_currentActivePart )
815 m_removingActivePart =
true;
821 void PartController::updatePartURL( KParts::ReadOnlyPart * ro_part )
823 if ( ro_part->url().isEmpty() )
825 kdDebug(9000) <<
"updatePartURL() called with empty URL for part: " << ro_part << endl;
828 _partURLMap[ ro_part ] = ro_part->url();
831 bool PartController::partURLHasChanged( KParts::ReadOnlyPart * ro_part )
833 if ( _partURLMap.contains( ro_part ) && !ro_part->url().isEmpty() )
835 if ( _partURLMap[ ro_part ] != ro_part->url() )
843 KURL PartController::storedURLForPart( KParts::ReadOnlyPart * ro_part )
845 if ( _partURLMap.contains( ro_part ) )
847 return _partURLMap[ ro_part ];
853 void PartController::slotUploadFinished()
855 KParts::ReadOnlyPart *ro_part =
const_cast<KParts::ReadOnlyPart*
>(
dynamic_cast<const KParts::ReadOnlyPart*
>(sender()) );
856 if ( !ro_part )
return;
858 if ( partURLHasChanged( ro_part ) )
860 emit partURLChanged( ro_part );
861 updatePartURL( ro_part );
865 KParts::ReadOnlyPart *PartController::partForURL(
const KURL &url)
867 TQPtrListIterator<KParts::Part> it(*parts());
868 for ( ; it.current(); ++it)
870 KParts::ReadOnlyPart *ro_part =
dynamic_cast<KParts::ReadOnlyPart*
>(it.current());
871 if (ro_part && url.path() == ro_part->url().path())
877 KParts::Part * PartController::partForWidget(
const TQWidget * widget )
879 TQPtrListIterator<KParts::Part> it(*parts());
880 for ( ; it.current(); ++it)
882 if ( it.current()->widget() == widget )
891 void PartController::activatePart(KParts::Part *part)
895 TQWidget * widget = EditorProxy::getInstance()->widgetForPart( part );
905 TQWidget* w2 = EditorProxy::getInstance()->widgetForPart( part );
910 bool PartController::closePart(KParts::Part *part)
912 KParts::ReadOnlyPart * ro_part =
913 dynamic_cast<KParts::ReadOnlyPart*
>( part );
915 if ( !ro_part )
return true;
917 KURL url = ro_part->url();
919 if (TQWidget* w = EditorProxy::getInstance()->topWidgetForPart( part ) )
921 if ( MultiBuffer *multiBuffer = dynamic_cast<MultiBuffer*>( w ) )
923 kdDebug(9000) <<
"About to delete MultiBuffered document..." 924 <<
" numberOfBuffers: " << multiBuffer->numberOfBuffers()
925 <<
" isActivated: " << multiBuffer->isActivated()
927 if ( !multiBuffer->closeURL( url ) )
930 if ( multiBuffer->numberOfBuffers() == 0
931 || !multiBuffer->isActivated() )
934 _dirtyDocuments.remove( static_cast<KParts::ReadWritePart*>( ro_part ) );
935 emit closedFile( url );
940 multiBuffer->deleteLater();
946 _dirtyDocuments.remove( static_cast<KParts::ReadWritePart*>( ro_part ) );
948 emit closedFile( url );
951 setActivePart( multiBuffer->activeBuffer() );
955 else if ( !ro_part->closeURL() )
959 else if ( !ro_part->closeURL() )
963 _dirtyDocuments.remove( static_cast<KParts::ReadWritePart*>( ro_part ) );
964 emit closedFile( url );
972 void PartController::updateMenuItems()
974 bool hasWriteParts =
false;
975 bool hasReadOnlyParts =
false;
977 TQPtrListIterator<KParts::Part> it(*parts());
978 for ( ; it.current(); ++it)
980 if (it.current()->inherits(
"KParts::ReadWritePart"))
981 hasWriteParts =
true;
982 if (it.current()->inherits(
"KParts::ReadOnlyPart"))
983 hasReadOnlyParts =
true;
986 m_saveAllFilesAction->setEnabled(hasWriteParts);
987 m_revertAllFilesAction->setEnabled(hasWriteParts);
988 m_closeWindowAction->setEnabled(hasReadOnlyParts);
989 m_closeAllWindowsAction->setEnabled(hasReadOnlyParts);
990 m_closeOtherWindowsAction->setEnabled(hasReadOnlyParts);
992 m_backAction->setEnabled( !m_backHistory.isEmpty() );
995 void PartController::slotRevertAllFiles()
1000 void PartController::reloadFile(
const KURL & url )
1002 KParts::ReadWritePart * part =
dynamic_cast<KParts::ReadWritePart*
>( partForURL( url ) );
1005 if ( part->isModified() )
1008 i18n(
"The file \"%1\" is modified in memory. Are you sure you want to reload it? (Local changes will be lost.)" ).arg( url.path() ),
1009 i18n(
"File is Modified" ), i18n(
"Reload"), i18n(
"Do Not Reload") ) == KMessageBox::Yes )
1011 part->setModified(
false );
1019 unsigned int line = 0;
unsigned int col = 0;
1020 KTextEditor::ViewCursorInterface * iface =
dynamic_cast<KTextEditor::ViewCursorInterface*
>( part->widget() );
1023 iface->cursorPositionReal( &line, &col );
1026 part->openURL( url );
1028 _dirtyDocuments.remove( part );
1029 emit documentChangedState( url, Clean );
1033 iface->setCursorPositionReal( line, col );
1038 void PartController::revertFiles(
const KURL::List & list )
1040 KURL::List::ConstIterator it = list.begin();
1041 while ( it != list.end() )
1048 void PartController::revertAllFiles()
1050 revertFiles( openURLs() );
1053 void PartController::slotCloseWindow()
1055 closePart( activePart() );
1058 KURL::List PartController::modifiedDocuments()
1060 KURL::List modFiles;
1062 TQPtrListIterator<KParts::Part> it( *parts() );
1063 while( it.current() )
1065 KParts::ReadWritePart *rw_part =
dynamic_cast<KParts::ReadWritePart*
>(it.current());
1066 if ( rw_part && rw_part->isModified() )
1068 modFiles << rw_part->url();
1075 void PartController::slotSave()
1077 kdDebug(9000) << k_funcinfo << endl;
1079 if ( KParts::ReadWritePart * part = dynamic_cast<KParts::ReadWritePart*>( activePart() ) )
1081 saveFile( part->url() );
1085 void PartController::slotReload()
1087 kdDebug(9000) << k_funcinfo << endl;
1089 if ( KParts::ReadWritePart * part = dynamic_cast<KParts::ReadWritePart*>( activePart() ) )
1091 reloadFile( part->url() );
1095 void PartController::slotSaveAllFiles()
1100 bool PartController::saveFile(
const KURL & url,
bool force )
1102 KParts::ReadWritePart * part =
dynamic_cast<KParts::ReadWritePart*
>( partForURL( url ) );
1103 if ( !part )
return true;
1105 switch( documentState( url ) )
1112 kdDebug(9000) <<
"Forced save" << endl;
1116 kdDebug(9000) <<
"Normal save" << endl;
1120 case DirtyAndModified:
1123 i18n(
"The file \"%1\" is modified on disk.\n\nAre you sure you want to overwrite it? (External changes will be lost.)").arg( url.path() ),
1124 i18n(
"File Externally Modified"), i18n(
"Overwrite"), i18n(
"Do Not Overwrite") );
1125 if ( code == KMessageBox::Yes )
1127 kdDebug(9000) <<
"Dirty save!!" << endl;
1129 else if ( code == KMessageBox::No )
1146 _dirtyDocuments.remove( part );
1147 emit documentChangedState( url, Clean );
1148 emit savedFile( url );
1154 bool PartController::saveAllFiles()
1156 return saveFiles( openURLs() );
1159 bool PartController::saveFiles( KURL::List
const & filelist )
1161 KURL::List::ConstIterator it = filelist.begin();
1162 while ( it != filelist.end() )
1164 if (saveFile( *it )==
false)
1171 bool PartController::querySaveFiles()
1173 return saveFilesDialog( KURL::List() );
1176 void PartController::clearModified( KURL::List
const & filelist )
1178 KURL::List::ConstIterator it = filelist.begin();
1179 while ( it != filelist.end() )
1181 KParts::ReadWritePart * rw_part =
dynamic_cast<KParts::ReadWritePart*
>( partForURL( *it ) );
1184 rw_part->setModified(
false );
1190 bool PartController::saveFilesDialog( KURL::List
const & ignoreList )
1192 KURL::List modList = modifiedDocuments();
1194 if ( modList.count() > 0 && modList != ignoreList )
1197 if ( dlg.exec() == TQDialog::Accepted )
1199 saveFiles( dlg.filesToSave() );
1200 clearModified( dlg.filesNotToSave() );
1210 bool PartController::closeFilesDialog( KURL::List
const & ignoreList )
1212 if ( !saveFilesDialog( ignoreList ) )
return false;
1214 TQPtrList<KParts::Part> partList( *parts() );
1215 TQPtrListIterator<KParts::Part> it( partList );
1216 while ( KParts::Part* part = it.current() )
1218 KParts::ReadOnlyPart * ro_part =
dynamic_cast<KParts::ReadOnlyPart*
>( part );
1219 if ( ro_part && !ignoreList.contains( ro_part->url() ) || !ro_part )
1228 bool PartController::closeFiles(
const KURL::List & list )
1230 KURL::List::ConstIterator it = list.begin();
1231 while ( it != list.end() )
1233 if ( !closePart( partForURL( *it ) ) )
1242 bool PartController::closeFile(
const KURL & url )
1244 return closePart( partForURL( url ) );
1247 bool PartController::closeAllFiles()
1249 return closeFilesDialog( KURL::List() );
1252 void PartController::slotCloseAllWindows()
1257 bool PartController::closeAllOthers(
const KURL & url )
1259 KURL::List ignoreList;
1260 ignoreList.append( url );
1262 return closeFilesDialog( ignoreList );
1266 void PartController::slotCloseOtherWindows()
1268 if ( KParts::ReadOnlyPart * active = dynamic_cast<KParts::ReadOnlyPart*>( activePart() ) )
1270 closeAllOthers( active->url() );
1274 void PartController::slotOpenFile()
1276 TQString DefaultEncoding;
1277 if ( TQDomDocument * projectDom = API::getInstance()->projectDom() )
1279 DefaultEncoding = DomUtil::readEntry( *projectDom,
"/general/defaultencoding", TQString() );
1282 if ( DefaultEncoding.isEmpty() )
1285 TDEConfig * config = kapp->config();
1286 config->setGroup(
"Kate Document Defaults");
1287 DefaultEncoding = config->readEntry(
"Encoding", TQString() );
1290 KEncodingFileDialog::Result result = KEncodingFileDialog::getOpenURLsAndEncoding( DefaultEncoding, TQString(),
1293 for ( KURL::List::Iterator it = result.URLs.begin(); it != result.URLs.end(); ++it )
1295 m_presetEncoding = result.encoding;
1296 editDocument( *it );
1300 void PartController::slotOpenRecent(
const KURL& url )
1302 editDocument( url );
1304 m_openRecentAction->setCurrentItem( -1 );
1307 bool PartController::readyToClose()
1309 blockSignals(
true );
1316 void PartController::slotActivePartChanged( KParts::Part *part )
1318 kdDebug(9000) << k_funcinfo << part << endl;
1320 if ( !m_isJumping && !m_removingActivePart )
1322 if ( KParts::ReadOnlyPart * ro_part = dynamic_cast<KParts::ReadOnlyPart*>(m_currentActivePart) )
1324 addHistoryEntry( ro_part );
1328 m_currentActivePart = part;
1329 m_removingActivePart =
false;
1332 KXMLGUIClient* client =
dynamic_cast<KXMLGUIClient*
>(part->widget());
1337 TQTimer::singleShot( 100,
this, TQT_SLOT(slotWaitForFactoryHack()) );
1342 if (!part->widget()) {
1347 TQPtrListIterator<KParts::Part> it(*parts());
1348 for ( ; it.current(); ++it)
1350 if( it.current() == part ){
1352 activatePart( it.current() );
1362 void PartController::slotDocumentDirty( Kate::Document * d,
bool isModified,
unsigned char reason )
1364 kdDebug(9000) << k_funcinfo << endl;
1367 KTextEditor::Document * doc = 0;
1369 TQPtrListIterator<KParts::Part> it( *parts() );
1370 while( it.current() )
1372 if ( (
void*)it.current() == (
void*)d )
1374 doc =
dynamic_cast<KTextEditor::Document*
>( it.current() );
1385 ModificationData * p =
new ModificationData;
1387 p->isModified = isModified;
1389 KDevJobTimer::singleShot( 0,
this, TQT_SLOT(slotDocumentDirtyStepTwo(
void*)), p );
1393 void PartController::slotDocumentDirtyStepTwo(
void * payload )
1395 if ( !payload )
return;
1397 ModificationData * p =
reinterpret_cast<ModificationData*
>( payload );
1398 KTextEditor::Document * doc = p->doc;
1401 bool haveDocument =
false;
1402 if(
const TQPtrList<KParts::Part> * partlist = parts() )
1404 TQPtrListIterator<KParts::Part> it( *partlist );
1405 while ( KParts::Part * part = it.current() )
1407 if ( p->doc == dynamic_cast<KTextEditor::Document*>( part ) )
1409 haveDocument =
true;
1415 if ( !haveDocument )
return;
1417 bool isModified = p->isModified;
1418 unsigned char reason = p->reason;
1421 KURL url = storedURLForPart( doc );
1422 if ( url.isEmpty() )
1424 kdDebug(9000) <<
"Warning!! the stored url is empty. Bailing out!" << endl;
1429 if ( !_dirtyDocuments.contains( doc ) )
1431 _dirtyDocuments.append( doc );
1434 if ( reactToDirty( url, reason ) )
1437 emit documentChangedState( url, Clean );
1438 _dirtyDocuments.remove( doc );
1447 _dirtyDocuments.remove( doc );
1448 emit documentChangedState( url, Clean );
1451 kdDebug(9000) << doc->url().url() << endl;
1452 kdDebug(9000) << isModified << endl;
1453 kdDebug(9000) << reason << endl;
1456 bool PartController::isDirty( KURL
const & url )
1458 return _dirtyDocuments.contains( static_cast<KTextEditor::Document*>( partForURL( url ) ) );
1461 bool PartController::reactToDirty( KURL
const & url,
unsigned char reason )
1463 TDEConfig *config = kapp->config();
1464 config->setGroup(
"Editor");
1465 TQString dirtyAction = config->readEntry(
"DirtyAction" );
1467 if ( dirtyAction ==
"nothing" )
return false;
1469 bool isModified =
true;
1470 if( KParts::ReadWritePart * part = dynamic_cast<KParts::ReadWritePart*>( partForURL( url ) ) )
1472 isModified = part->isModified();
1476 kdDebug(9000) << k_funcinfo <<
" Warning. Not a ReadWritePart." << endl;
1483 i18n(
"Conflict: The file \"%1\" has changed on disk while being modified in memory.\n\n" 1484 "You should investigate before saving to make sure you are not losing data.").arg( url.path() ),
1492 i18n(
"Warning: The file \"%1\" has been deleted on disk.\n\n" 1493 "If this was not your intention, make sure to save this file now.").arg( url.path() ),
1494 i18n(
"File Deleted") );
1498 if ( dirtyAction ==
"alert" )
1501 i18n(
"The file \"%1\" has changed on disk.\n\nDo you want to reload it?").arg( url.path() ),
1502 i18n(
"File Changed"), i18n(
"Reload"), i18n(
"Do Not Reload") ) == KMessageBox::No )
1514 void PartController::slotNewDesignerStatus(
const TQString &formName,
int status)
1516 kdDebug(9000) << k_funcinfo << endl;
1517 kdDebug(9000) <<
" formName: " << formName <<
", status: " << status << endl;
1518 emit documentChangedState( KURL::fromPathOrURL(formName), DocumentState(status) );
1521 void PartController::slotNewStatus( )
1523 kdDebug(9000) << k_funcinfo << endl;
1525 TQObject * senderobj = TQT_TQOBJECT(const_cast<TQT_BASE_OBJECT_NAME*>( sender() ));
1526 KTextEditor::View * view =
dynamic_cast<KTextEditor::View*
>( senderobj );
1529 doEmitState( view->document()->url() );
1533 DocumentState PartController::documentState( KURL
const & url )
1535 KParts::ReadWritePart * rw_part =
dynamic_cast<KParts::ReadWritePart*
>( partForURL( url ) );
1536 if ( !rw_part )
return Clean;
1538 DocumentState state = Clean;
1539 if ( rw_part->isModified() )
1544 if ( isDirty( url ) )
1546 if ( state == Modified )
1548 state = DirtyAndModified;
1559 void PartController::doEmitState( KURL
const & url )
1561 emit documentChangedState( url, documentState( url ) );
1564 KURL::List PartController::openURLs( )
1567 TQPtrListIterator<KParts::Part> it(*parts());
1568 for ( ; it.current(); ++it)
1570 if ( KParts::ReadOnlyPart *ro_part = dynamic_cast<KParts::ReadOnlyPart*>(it.current()) )
1572 list << ro_part->url();
1582 PartController::HistoryEntry::HistoryEntry(
const KURL & u,
int l,
int c)
1583 : url(u), line(l), col(c)
1585 id = abs( TQTime::currentTime().msecsTo( TQTime() ) );
1588 void PartController::slotBack()
1590 HistoryEntry thatEntry = m_backHistory.front();
1591 m_backHistory.pop_front();
1592 m_backAction->setEnabled( !m_backHistory.isEmpty() );
1594 HistoryEntry thisEntry = createHistoryEntry();
1595 if ( !thisEntry.url.isEmpty() )
1597 m_forwardHistory.push_front( thisEntry );
1598 m_forwardAction->setEnabled(
true );
1601 jumpTo( thatEntry );
1604 void PartController::slotForward()
1606 HistoryEntry thatEntry = m_forwardHistory.front();
1607 m_forwardHistory.pop_front();
1608 m_forwardAction->setEnabled( !m_forwardHistory.isEmpty() );
1610 HistoryEntry thisEntry = createHistoryEntry();
1611 if ( !thisEntry.url.isEmpty() )
1613 m_backHistory.push_front( thisEntry );
1614 m_backAction->setEnabled(
true );
1617 jumpTo( thatEntry );
1620 void PartController::slotBackAboutToShow()
1622 TDEPopupMenu *popup = m_backAction->popupMenu();
1625 if ( m_backHistory.isEmpty())
return;
1628 TQValueList<HistoryEntry>::ConstIterator it = m_backHistory.begin();
1629 while( i < 10 && it != m_backHistory.end() )
1631 popup->insertItem( (*it).url.fileName() + TQString(
" (%1)").arg( (*it).line +1), (*it).id );
1637 void PartController::slotForwardAboutToShow( )
1639 TDEPopupMenu * popup = m_forwardAction->popupMenu();
1642 if ( m_forwardHistory.isEmpty() )
return;
1645 TQValueList<HistoryEntry>::ConstIterator it = m_forwardHistory.begin();
1646 while( i < 10 && it != m_forwardHistory.end() )
1648 popup->insertItem( (*it).url.fileName() + TQString(
" (%1)").arg( (*it).line +1), (*it).id );
1654 void PartController::slotBackPopupActivated(
int id )
1656 TQValueList<HistoryEntry>::Iterator it = m_backHistory.begin();
1657 while( it != m_backHistory.end() )
1659 if ( (*it).id ==
id )
1661 HistoryEntry entry = *it;
1662 m_backHistory.erase( m_backHistory.begin(), ++it );
1663 m_backAction->setEnabled( !m_backHistory.isEmpty() );
1665 HistoryEntry thisEntry = createHistoryEntry();
1666 if ( !thisEntry.url.isEmpty() )
1668 m_forwardHistory.push_front( thisEntry );
1669 m_forwardAction->setEnabled(
true );
1679 void PartController::slotForwardPopupActivated(
int id )
1681 TQValueList<HistoryEntry>::Iterator it = m_forwardHistory.begin();
1682 while( it != m_forwardHistory.end() )
1684 if ( (*it).id ==
id )
1686 HistoryEntry entry = *it;
1687 m_forwardHistory.erase( m_forwardHistory.begin(), ++it );
1688 m_forwardAction->setEnabled( !m_forwardHistory.isEmpty() );
1690 HistoryEntry thisEntry = createHistoryEntry();
1691 if ( !thisEntry.url.isEmpty() )
1693 m_backHistory.push_front( thisEntry );
1694 m_backAction->setEnabled(
true );
1704 void PartController::jumpTo(
const HistoryEntry & entry )
1707 editDocument( entry.url, entry.line, entry.col );
1708 m_isJumping =
false;
1712 PartController::HistoryEntry PartController::createHistoryEntry( KParts::ReadOnlyPart * ro_part ) {
1714 ro_part =
dynamic_cast<KParts::ReadOnlyPart*
>( activePart() );
1716 if ( !ro_part )
return HistoryEntry();
1717 KTextEditor::ViewCursorInterface * cursorIface =
dynamic_cast<KTextEditor::ViewCursorInterface*
>( ro_part->widget() );
1718 if ( !cursorIface )
return HistoryEntry();
1722 cursorIface->cursorPositionReal( &line, &col );
1724 return HistoryEntry( ro_part->url(), line, col );
1729 void PartController::addHistoryEntry( KParts::ReadOnlyPart * part )
1731 if ( m_isJumping )
return;
1733 HistoryEntry thisEntry = createHistoryEntry( part );
1734 if ( !thisEntry.url.isEmpty() )
1736 HistoryEntry lastEntry = m_backHistory.front();
1737 if ( (lastEntry.url.path() != thisEntry.url.path()) || (lastEntry.line != thisEntry.line) )
1739 m_backHistory.push_front( thisEntry );
1740 m_backAction->setEnabled(
true );
1742 m_forwardHistory.clear();
1743 m_forwardAction->setEnabled(
false );
1747 kdDebug(9000) <<
"** avoiding to create duplicate history entry **" << endl;
1754 void PartController::slotWaitForFactoryHack( )
1758 if ( !activePart() )
return;
1760 if ( dynamic_cast<KTextEditor::View*>( activePart()->widget() ) )
1762 if ( !activePart()->factory() )
1764 TQTimer::singleShot( 100,
this, TQT_SLOT(slotWaitForFactoryHack()) );
1769 EditorProxy::getInstance()->installPopup( activePart() );
1773 if ( MultiBuffer *multiBuffer =
1774 dynamic_cast<MultiBuffer*>(
1775 EditorProxy::getInstance()->topWidgetForPart( activePart() ) )
1778 KURL url =
dynamic_cast<KParts::ReadOnlyPart*
>( activePart() )->url();
1779 multiBuffer->activePartChanged( url );
1782 emit documentChangedState( url, documentState( url ) );
1786 KParts::ReadOnlyPart *PartController::qtDesignerPart()
1788 TQPtrListIterator<KParts::Part> it(*parts());
1789 for ( ; it.current(); ++it)
1791 KInterfaceDesigner::Designer *des =
dynamic_cast<KInterfaceDesigner::Designer*
>(it.current());
1792 if (des && des->designerType() == KInterfaceDesigner::TQtDesigner)
1798 KTextEditor::Editor *PartController::openTextDocument(
bool activate )
1800 KTextEditor::Editor *editorpart =
1801 createEditorPart( activate,
false, KURL( i18n(
"unnamed") ) );
1805 if ( !m_presetEncoding.isNull() )
1807 KParts::BrowserExtension * extension =
1808 KParts::BrowserExtension::childObject( editorpart );
1811 KParts::URLArgs args;
1812 args.serviceType = TQString(
"text/plain;" ) + m_presetEncoding;
1813 extension->setURLArgs(args);
1815 m_presetEncoding = TQString();
1819 EditorProxy::getInstance()->topWidgetForPart( editorpart );
1822 integratePart(editorpart, KURL(i18n(
"unnamed")), widget,
true,
true);
1824 EditorProxy::getInstance()->setLineNumber(editorpart, 0, 0);
1830 void PartController::textChanged()
1832 if ( KTextEditor::Document * doc = dynamic_cast<KTextEditor::Document*>( activePart() ) )
1834 if ( KTextEditor::ViewCursorInterface * vci = dynamic_cast<KTextEditor::ViewCursorInterface*>( doc->widget() ) )
1836 m_gotoLastEditPosAction->setEnabled(
true );
1838 m_lastEditPos.url = doc->url();
1839 vci->cursorPosition( &m_lastEditPos.pos.first, &m_lastEditPos.pos.second );
1844 void PartController::gotoLastEditPos()
1846 editDocument( m_lastEditPos.url, m_lastEditPos.pos.first, m_lastEditPos.pos.second );
1849 void PartController::slotDocumentUrlChanged()
1851 TQObject *obj = TQT_TQOBJECT(const_cast<TQT_BASE_OBJECT_NAME*>(sender()));
1852 KTextEditor::Document *doc =
dynamic_cast<KTextEditor::Document*
>( obj );
1856 MultiBuffer *multiBuffer =
dynamic_cast<MultiBuffer*
>(
1857 EditorProxy::getInstance()->findPartWidget( doc ));
1861 multiBuffer->updateUrlForPart(doc, doc->url());
1863 emit partURLChanged(doc);
1866 #include "partcontroller.moc" Part controler implementation.
static void setupShourtcutTips(KXMLGUIClient *client=0)
Setup shourtcut tips.
void showPart(KParts::Part *part, const TQString &name, const TQString &shortDescription)
static KDevMainWindow * getInstance()
Get a pointer to the single KDevTopLevel object.