23
#include "PreCompiled.h"
27
# include <QMessageBox>
30
#include <App/Application.h>
31
#include <App/ElementNamingUtils.h>
32
#include <App/Document.h>
33
#include <App/DocumentObject.h>
35
#include <Base/Exception.h>
36
#include <Base/Tools.h>
39
#include "Application.h"
42
#include "MainWindow.h"
45
#include "ViewProviderDocumentObject.h"
46
#include "WaitCursor.h"
49
FC_LOG_LEVEL_INIT("CommandLink", true, true)
53
static void setLinkLabel(App::DocumentObject *obj, const char *doc, const char *name) {
54
std::string label = obj->Label.getValue();
55
label = Base::Tools::escapeEncodeString(label);
56
Command::doCommand(Command::Doc,"App.getDocument('%s').getObject('%s').Label='%s'",doc,name,label.c_str());
61
class StdCmdLinkMakeGroup : public Gui::Command
64
StdCmdLinkMakeGroup();
65
const char* className() const override
66
{ return "StdCmdLinkMakeGroup"; }
69
void activated(int iMsg) override;
70
bool isActive() override;
71
Action * createAction() override;
72
void languageChange() override;
75
StdCmdLinkMakeGroup::StdCmdLinkMakeGroup()
76
: Command("Std_LinkMakeGroup")
79
sMenuText = QT_TR_NOOP("Make link group");
80
sToolTipText = QT_TR_NOOP("Create a group of links");
81
sWhatsThis = "Std_LinkMakeGroup";
82
sStatusTip = sToolTipText;
84
sPixmap = "LinkGroup";
87
bool StdCmdLinkMakeGroup::isActive() {
88
return !!App::GetApplication().getActiveDocument();
91
Action * StdCmdLinkMakeGroup::createAction()
93
auto pcAction = new ActionGroup(this, getMainWindow());
94
pcAction->setDropDownMenu(true);
95
applyCommandData(this->className(), pcAction);
98
QAction* action = nullptr;
99
action = pcAction->addAction(QObject::tr("Simple group"));
100
action->setWhatsThis(QString::fromLatin1(getWhatsThis()));
101
action = pcAction->addAction(QObject::tr("Group with links"));
102
action->setWhatsThis(QString::fromLatin1(getWhatsThis()));
103
action = pcAction->addAction(QObject::tr("Group with transform links"));
104
action->setWhatsThis(QString::fromLatin1(getWhatsThis()));
108
void StdCmdLinkMakeGroup::languageChange()
110
Command::languageChange();
114
auto pcAction = qobject_cast<ActionGroup*>(_pcAction);
115
QList<QAction*> acts = pcAction->actions();
116
acts[0]->setText(QObject::tr("Simple group"));
117
acts[1]->setText(QObject::tr("Group with links"));
118
acts[2]->setText(QObject::tr("Group with transform links"));
122
void StdCmdLinkMakeGroup::activated(int option) {
124
std::vector<App::DocumentObject*> objs;
125
std::set<App::DocumentObject*> objset;
127
auto doc = App::GetApplication().getActiveDocument();
129
FC_ERR("no active document");
133
for(auto &sel : Selection().getCompleteSelection()) {
134
if(sel.pObject && sel.pObject->isAttachedToDocument() &&
135
objset.insert(sel.pObject).second)
136
objs.push_back(sel.pObject);
139
Selection().selStackPush();
140
Selection().clearCompleteSelection();
142
Command::openCommand(QT_TRANSLATE_NOOP("Command", "Make link group"));
144
std::string groupName = doc->getUniqueObjectName("LinkGroup");
145
Command::doCommand(Command::Doc,
146
"App.getDocument('%s').addObject('App::LinkGroup','%s')",doc->getName(),groupName.c_str());
148
Selection().addSelection(doc->getName(),groupName.c_str());
149
Selection().selStackPush();
151
Command::doCommand(Command::Doc,"__objs__ = []");
152
for(auto obj : objs) {
154
if(option!=0 || doc!=obj->getDocument()) {
155
name = doc->getUniqueObjectName("Link");
156
Command::doCommand(Command::Doc,
157
"App.getDocument('%s').addObject('App::Link','%s').setLink("
158
"App.getDocument('%s').getObject('%s'))",
159
doc->getName(),name.c_str(),obj->getDocument()->getName(),obj->getNameInDocument());
160
setLinkLabel(obj,doc->getName(),name.c_str());
162
Command::doCommand(Command::Doc,
163
"App.getDocument('%s').getObject('%s').LinkTransform = True",
164
doc->getName(),name.c_str());
165
else if(obj->getPropertyByName("Placement"))
166
Command::doCommand(Command::Doc,
167
"App.getDocument('%s').getObject('%s').Placement = "
168
"App.getDocument('%s').getObject('%s').Placement",
169
doc->getName(),name.c_str(),obj->getDocument()->getName(),obj->getNameInDocument());
171
name = obj->getNameInDocument();
172
Command::doCommand(Command::Doc,"__objs__.append(App.getDocument('%s').getObject('%s'))",
173
doc->getName(),name.c_str());
174
Command::doCommand(Command::Doc,
175
"App.getDocument('%s').getObject('%s').ViewObject.Visibility=False",
176
doc->getName(),name.c_str());
178
Command::doCommand(Command::Doc,"App.getDocument('%s').getObject('%s').setLink(__objs__)",
179
doc->getName(),groupName.c_str());
180
Command::doCommand(Command::Doc,"del __objs__");
182
for(size_t i=0;i<objs.size();++i) {
183
auto name = std::to_string(i)+".";
184
Selection().addSelection(doc->getName(),groupName.c_str(),name.c_str());
186
Selection().selStackPush();
189
Command::doCommand(Command::Doc,
190
"App.getDocument('%s').getObject('%s').LinkMode = 'Auto Delete'",
191
doc->getName(),groupName.c_str());
193
Command::commitCommand();
194
} catch (const Base::Exception& e) {
195
QMessageBox::critical(getMainWindow(), QObject::tr("Create link group failed"),
196
QString::fromLatin1(e.what()));
197
Command::abortCommand();
204
DEF_STD_CMD_A(StdCmdLinkMake)
206
StdCmdLinkMake::StdCmdLinkMake()
207
: Command("Std_LinkMake")
210
sMenuText = QT_TR_NOOP("Make link");
211
sToolTipText = QT_TR_NOOP("A Link is an object that references or links to another object in the same document, "
212
"or in another document. Unlike Clones, Links reference the original Shape directly, "
213
"making them more memory-efficient, which helps with the creation of complex assemblies.");
214
sWhatsThis = "Std_LinkMake";
215
sStatusTip = sToolTipText;
220
bool StdCmdLinkMake::isActive() {
221
return App::GetApplication().getActiveDocument();
224
void StdCmdLinkMake::activated(int) {
225
auto doc = App::GetApplication().getActiveDocument();
227
FC_ERR("no active document");
231
std::set<App::DocumentObject*> objs;
232
for(auto &sel : Selection().getCompleteSelection()) {
233
if(sel.pObject && sel.pObject->isAttachedToDocument())
234
objs.insert(sel.pObject);
237
Selection().selStackPush();
238
Selection().clearCompleteSelection();
240
Command::openCommand(QT_TRANSLATE_NOOP("Command", "Make link"));
243
std::string name = doc->getUniqueObjectName("Link");
244
Command::doCommand(Command::Doc, "App.getDocument('%s').addObject('App::Link','%s')",
245
doc->getName(),name.c_str());
246
Selection().addSelection(doc->getName(),name.c_str());
248
for(auto obj : objs) {
249
std::string name = doc->getUniqueObjectName("Link");
250
Command::doCommand(Command::Doc,
251
"App.getDocument('%s').addObject('App::Link','%s').setLink(App.getDocument('%s').%s)",
252
doc->getName(),name.c_str(),obj->getDocument()->getName(),obj->getNameInDocument());
253
setLinkLabel(obj,doc->getName(),name.c_str());
254
Selection().addSelection(doc->getName(),name.c_str());
257
Selection().selStackPush();
258
Command::commitCommand();
259
} catch (const Base::Exception& e) {
260
Command::abortCommand();
261
QMessageBox::critical(getMainWindow(), QObject::tr("Create link failed"),
262
QString::fromLatin1(e.what()));
269
DEF_STD_CMD_A(StdCmdLinkMakeRelative)
271
StdCmdLinkMakeRelative::StdCmdLinkMakeRelative()
272
: Command("Std_LinkMakeRelative")
275
sMenuText = QT_TR_NOOP("Make sub-link");
276
sToolTipText = QT_TR_NOOP("Create a sub-object or sub-element link");
277
sWhatsThis = "Std_LinkMakeRelative";
278
sStatusTip = sToolTipText;
283
bool StdCmdLinkMakeRelative::isActive() {
284
return Selection().hasSubSelection(nullptr,true);
287
void StdCmdLinkMakeRelative::activated(int) {
288
auto doc = App::GetApplication().getActiveDocument();
290
FC_ERR("no active document");
293
Command::openCommand(QT_TRANSLATE_NOOP("Command", "Make sub-link"));
295
std::map<std::pair<App::DocumentObject*,std::string>,
296
std::pair<App::DocumentObject*, std::vector<std::string> > > linkInfo;
297
for(auto &sel : Selection().getCompleteSelection(ResolveMode::NoResolve)) {
298
if(!sel.pObject || !sel.pObject->isAttachedToDocument())
300
auto key = std::make_pair(sel.pObject,
301
Data::noElementName(sel.SubName));
302
auto element = Data::findElementName(sel.SubName);
303
auto &info = linkInfo[key];
304
info.first = sel.pResolvedObject;
305
if(element && element[0])
306
info.second.emplace_back(element);
309
Selection().selStackPush();
310
Selection().clearCompleteSelection();
312
for(auto &v : linkInfo) {
314
auto &info = v.second;
316
std::string name = doc->getUniqueObjectName("Link");
318
std::ostringstream ss;
320
for(auto &s : info.second)
321
ss << "'" << s << "',";
323
FCMD_DOC_CMD(doc,"addObject('App::Link','" << name << "').setLink("
324
<< getObjectCmd(key.first) << ",'" << key.second
325
<< "'," << ss.str() << ")");
326
auto link = doc->getObject(name.c_str());
327
FCMD_OBJ_CMD(link,"LinkTransform = True");
328
setLinkLabel(info.first,doc->getName(),name.c_str());
330
Selection().addSelection(doc->getName(),name.c_str());
332
Selection().selStackPush();
333
Command::commitCommand();
334
} catch (const Base::Exception& e) {
335
Command::abortCommand();
336
QMessageBox::critical(getMainWindow(), QObject::tr("Failed to create relative link"),
337
QString::fromLatin1(e.what()));
347
App::DocumentObjectT topParent;
349
App::DocumentObjectT parent;
350
App::DocumentObjectT obj;
353
static void linkConvert(bool unlink) {
362
std::map<std::pair<App::DocumentObject*,App::DocumentObject*>, Info> infos;
363
for(const auto& sel : TreeWidget::getSelection()) {
364
auto obj = sel.vp->getObject();
365
auto parent = sel.parentVp;
367
FC_WARN("skip '" << obj->getFullName() << "' with no parent");
370
auto parentObj = parent->getObject();
371
auto &info = infos[std::make_pair(parentObj,obj)];
376
auto linked = obj->getLinkedObject(false);
377
if(!linked || !linked->isAttachedToDocument() || linked == obj) {
378
FC_WARN("skip non link");
382
info.topParent = sel.topParent;
383
info.parent = parentObj;
390
Selection().selStackPush();
391
Selection().clearCompleteSelection();
394
const char *transactionName = unlink?"Unlink":"Replace with link";
395
Command::openCommand(transactionName);
397
std::unordered_map<App::DocumentObject*,App::DocumentObjectT> recomputeSet;
398
for(auto &v : infos) {
399
auto &info = v.second;
400
auto parent = info.parent.getObject();
401
auto parentVp = Base::freecad_dynamic_cast<ViewProviderDocumentObject>(
402
Application::Instance->getViewProvider(parent));
403
auto obj = info.obj.getObject();
404
if(!parent || !obj || !parentVp)
406
if(!recomputeSet.count(parent))
407
recomputeSet.emplace(parent,parent);
408
auto doc = parent->getDocument();
409
App::DocumentObject *replaceObj;
411
replaceObj = obj->getLinkedObject(false);
412
if(!replaceObj || !replaceObj->isAttachedToDocument() || replaceObj == obj)
415
auto name = doc->getUniqueObjectName("Link");
416
auto link = static_cast<App::Link*>(doc->addObject("App::Link",name.c_str()));
418
FC_THROWM(Base::RuntimeError,"Failed to create link");
419
link->setLink(-1,obj);
420
link->Label.setValue(obj->Label.getValue());
421
auto pla = Base::freecad_dynamic_cast<App::PropertyPlacement>(
422
obj->getPropertyByName("Placement"));
424
link->Placement.setValue(pla->getValue());
426
link->LinkTransform.setValue(true);
431
auto pos = info.subname.rfind('.');
432
if(pos==std::string::npos && pos)
433
info.subname.clear();
435
pos = info.subname.rfind('.',pos-1);
436
if(pos==std::string::npos)
437
info.subname.clear();
439
info.subname.resize(pos+1);
440
info.subname += replaceObj->getNameInDocument();
446
if(parentVp->replaceObject(obj,replaceObj)<=0)
447
FC_THROWM(Base::RuntimeError,
448
"Failed to change link for " << parent->getFullName());
451
std::vector<App::DocumentObject *> recomputes;
452
for(auto &v : recomputeSet) {
453
auto obj = v.second.getObject();
455
recomputes.push_back(obj);
457
if(!recomputes.empty())
458
recomputes.front()->getDocument()->recompute(recomputes);
460
Command::commitCommand();
462
} catch (const Base::Exception& e) {
463
Command::abortCommand();
464
auto title = unlink?QObject::tr("Unlink failed"):QObject::tr("Replace link failed");
465
QMessageBox::critical(getMainWindow(), title, QString::fromLatin1(e.what()));
471
static bool linkConvertible(bool unlink) {
473
for(auto &sel : TreeWidget::getSelection()) {
474
auto parent = sel.parentVp;
477
auto obj = sel.vp->getObject();
479
auto linked = obj->getLinkedObject(false);
480
if(!linked || linked == obj)
490
DEF_STD_CMD_A(StdCmdLinkReplace)
492
StdCmdLinkReplace::StdCmdLinkReplace()
493
: Command("Std_LinkReplace")
496
sMenuText = QT_TR_NOOP("Replace with link");
497
sToolTipText = QT_TR_NOOP("Replace the selected object(s) with link");
498
sWhatsThis = "Std_LinkReplace";
499
sStatusTip = sToolTipText;
501
sPixmap = "LinkReplace";
504
bool StdCmdLinkReplace::isActive() {
505
return linkConvertible(false);
508
void StdCmdLinkReplace::activated(int) {
514
DEF_STD_CMD_A(StdCmdLinkUnlink)
516
StdCmdLinkUnlink::StdCmdLinkUnlink()
517
: Command("Std_LinkUnlink")
520
sMenuText = QT_TR_NOOP("Unlink");
521
sToolTipText = QT_TR_NOOP("Strip on level of link");
522
sWhatsThis = "Std_LinkUnlink";
523
sStatusTip = sToolTipText;
528
bool StdCmdLinkUnlink::isActive() {
529
return linkConvertible(true);
532
void StdCmdLinkUnlink::activated(int) {
538
DEF_STD_CMD_A(StdCmdLinkImport)
540
StdCmdLinkImport::StdCmdLinkImport()
541
: Command("Std_LinkImport")
544
sMenuText = QT_TR_NOOP("Import links");
545
sToolTipText = QT_TR_NOOP("Import selected external link(s)");
546
sWhatsThis = "Std_LinkImport";
547
sStatusTip = sToolTipText;
549
sPixmap = "LinkImport";
552
static std::map<App::Document*, std::vector<App::DocumentObject*> > getLinkImportSelections()
554
std::map<App::Document*, std::vector<App::DocumentObject*> > objMap;
555
for(auto &sel : Selection().getCompleteSelection(ResolveMode::NoResolve)) {
556
auto obj = sel.pObject->resolve(sel.SubName);
557
if(!obj || !obj->isAttachedToDocument())
559
for(auto o : obj->getOutList()) {
560
if(o && o->isAttachedToDocument() && o->getDocument()!=obj->getDocument()) {
561
objMap[obj->getDocument()].push_back(obj);
569
bool StdCmdLinkImport::isActive() {
570
auto links = getLinkImportSelections();
573
for(auto &v : links) {
574
if(v.first->testStatus(App::Document::PartialDoc))
580
void StdCmdLinkImport::activated(int) {
581
Command::openCommand(QT_TRANSLATE_NOOP("Command", "Import links"));
584
wc.setIgnoreEvents(WaitCursor::NoEvents);
585
for(auto &v : getLinkImportSelections()) {
588
for(auto obj : doc->importLinks(v.second))
589
obj->Visibility.setValue(false);
591
Command::commitCommand();
592
}catch (const Base::Exception& e) {
593
Command::abortCommand();
594
QMessageBox::critical(getMainWindow(), QObject::tr("Failed to import links"),
595
QString::fromLatin1(e.what()));
602
DEF_STD_CMD_A(StdCmdLinkImportAll)
604
StdCmdLinkImportAll::StdCmdLinkImportAll()
605
: Command("Std_LinkImportAll")
608
sMenuText = QT_TR_NOOP("Import all links");
609
sToolTipText = QT_TR_NOOP("Import all links of the active document");
610
sWhatsThis = "Std_LinkImportAll";
611
sStatusTip = sToolTipText;
613
sPixmap = "LinkImportAll";
616
bool StdCmdLinkImportAll::isActive() {
617
auto doc = App::GetApplication().getActiveDocument();
618
return doc && !doc->testStatus(App::Document::PartialDoc) && App::PropertyXLink::hasXLink(doc);
621
void StdCmdLinkImportAll::activated(int) {
622
Command::openCommand(QT_TRANSLATE_NOOP("Command", "Import all links"));
625
wc.setIgnoreEvents(WaitCursor::NoEvents);
626
auto doc = App::GetApplication().getActiveDocument();
628
for(auto obj : doc->importLinks())
629
obj->Visibility.setValue(false);
631
Command::commitCommand();
632
} catch (const Base::Exception& e) {
633
QMessageBox::critical(getMainWindow(), QObject::tr("Failed to import all links"),
634
QString::fromLatin1(e.what()));
635
Command::abortCommand();
643
DEF_STD_CMD_A(StdCmdLinkSelectLinked)
645
StdCmdLinkSelectLinked::StdCmdLinkSelectLinked()
646
: Command("Std_LinkSelectLinked")
649
sMenuText = QT_TR_NOOP("Go to linked object");
650
sToolTipText = QT_TR_NOOP("Select the linked object and switch to its owner document");
651
sWhatsThis = "Std_LinkSelectLinked";
652
sStatusTip = sToolTipText;
653
eType = AlterSelection;
654
sPixmap = "LinkSelect";
658
static App::DocumentObject *getSelectedLink(bool finalLink, std::string *subname=nullptr) {
659
const auto &sels = Selection().getSelection("*", ResolveMode::NoResolve, true);
662
auto sobj = sels[0].pObject->getSubObject(sels[0].SubName);
665
auto vp = Base::freecad_dynamic_cast<ViewProviderDocumentObject>(
666
Application::Instance->getViewProvider(sobj));
670
auto linkedVp = vp->getLinkedViewProvider(subname,finalLink);
671
if(!linkedVp || linkedVp==vp) {
672
if(sobj->getDocument()==sels[0].pObject->getDocument())
674
for(const char *dot=strchr(sels[0].SubName,'.');dot;dot=strchr(dot+1,'.')) {
675
std::string sub(sels[0].SubName,dot+1-sels[0].SubName);
676
auto obj = sels[0].pObject->getSubObject(sub.c_str());
679
obj = obj->getLinkedObject(true);
680
if(obj->getDocument()!=sels[0].pObject->getDocument()) {
682
return sobj==obj?nullptr:sobj;
684
*subname = std::string(dot+1);
688
return finalLink?nullptr:sobj;
691
if(finalLink && linkedVp == vp->getLinkedViewProvider())
694
auto linked = linkedVp->getObject();
695
if(!linked || !linked->isAttachedToDocument())
698
if(subname && sels[0].pObject!=sobj && sels[0].SubName) {
701
std::size_t post_len=0;
707
for(auto &v : linked->getParents()) {
708
if(v.first != sels[0].pObject)
711
const char *sub = v.second.c_str();
712
const char *dot = sub;
713
for(const char *s=sels[0].SubName; *s && *sub==*s; ++s,++sub) {
718
if(dot-v.second.c_str() > pre_len
719
|| (dot-v.second.c_str()==pre_len
720
&& v.second.size()<post_len))
722
pre_len = dot-v.second.c_str();
723
prefix = std::string(sels[0].SubName,pre_len) + (v.second.c_str()+pre_len);
724
post_len = v.second.size();
726
if(prefix2.empty() || prefix2.size() > v.second.size())
732
linked = sels[0].pObject;
733
*subname = !prefix.empty()?prefix:prefix2 + *subname;
740
bool StdCmdLinkSelectLinked::isActive() {
741
return getSelectedLink(false) != nullptr;
744
void StdCmdLinkSelectLinked::activated(int)
747
auto linked = getSelectedLink(false,&subname);
749
FC_WARN("invalid selection");
752
Selection().selStackPush();
753
Selection().clearCompleteSelection();
754
if(!subname.empty()) {
755
Selection().addSelection(linked->getDocument()->getName(),linked->getNameInDocument(),subname.c_str());
756
auto doc = Application::Instance->getDocument(linked->getDocument());
758
auto vp = dynamic_cast<ViewProviderDocumentObject*>(Application::Instance->getViewProvider(linked));
759
doc->setActiveView(vp);
762
const auto trees = getMainWindow()->findChildren<TreeWidget*>();
763
for(auto tree : trees)
764
tree->selectLinkedObject(linked);
766
Selection().selStackPush();
771
DEF_STD_CMD_A(StdCmdLinkSelectLinkedFinal)
773
StdCmdLinkSelectLinkedFinal::StdCmdLinkSelectLinkedFinal()
774
: Command("Std_LinkSelectLinkedFinal")
777
sMenuText = QT_TR_NOOP("Go to the deepest linked object");
778
sToolTipText = QT_TR_NOOP("Select the deepest linked object and switch to its owner document");
779
sWhatsThis = "Std_LinkSelectLinkedFinal";
780
sStatusTip = sToolTipText;
781
eType = AlterSelection;
782
sPixmap = "LinkSelectFinal";
786
bool StdCmdLinkSelectLinkedFinal::isActive() {
787
return getSelectedLink(true) != nullptr;
790
void StdCmdLinkSelectLinkedFinal::activated(int) {
791
auto linked = getSelectedLink(true);
793
FC_WARN("invalid selection");
796
Selection().selStackPush();
797
Selection().clearCompleteSelection();
798
const auto trees = getMainWindow()->findChildren<TreeWidget*>();
799
for(auto tree : trees)
800
tree->selectLinkedObject(linked);
801
Selection().selStackPush();
806
DEF_STD_CMD_A(StdCmdLinkSelectAllLinks)
808
StdCmdLinkSelectAllLinks::StdCmdLinkSelectAllLinks()
809
: Command("Std_LinkSelectAllLinks")
812
sMenuText = QT_TR_NOOP("Select all links");
813
sToolTipText = QT_TR_NOOP("Select all links to the current selected object");
814
sWhatsThis = "Std_LinkSelectAllLinks";
815
sStatusTip = sToolTipText;
816
eType = AlterSelection;
817
sPixmap = "LinkSelectAll";
820
bool StdCmdLinkSelectAllLinks::isActive() {
821
const auto &sels = Selection().getSelection("*", ResolveMode::OldStyleElement, true);
824
return App::GetApplication().hasLinksTo(sels[0].pObject);
827
void StdCmdLinkSelectAllLinks::activated(int)
829
auto sels = Selection().getSelection("*", ResolveMode::OldStyleElement, true);
832
Selection().selStackPush();
833
Selection().clearCompleteSelection();
834
const auto trees = getMainWindow()->findChildren<TreeWidget*>();
835
for(auto tree : trees)
836
tree->selectAllLinks(sels[0].pObject);
837
Selection().selStackPush();
845
class StdCmdLinkSelectActions : public GroupCommand
848
StdCmdLinkSelectActions()
849
: GroupCommand("Std_LinkSelectActions")
852
sMenuText = QT_TR_NOOP("Link navigation");
853
sToolTipText = QT_TR_NOOP("Link navigation actions");
854
sWhatsThis = "Std_LinkSelectActions";
855
sStatusTip = QT_TR_NOOP("Link navigation actions");
856
eType = AlterSelection;
859
addCommand(new StdCmdLinkSelectLinked());
860
addCommand(new StdCmdLinkSelectLinkedFinal());
861
addCommand(new StdCmdLinkSelectAllLinks());
864
const char* className() const override {return "StdCmdLinkSelectActions";}
871
class StdCmdLinkActions : public GroupCommand
875
: GroupCommand("Std_LinkActions")
878
sMenuText = QT_TR_NOOP("Link actions");
879
sToolTipText = QT_TR_NOOP("Actions that apply to link objects");
880
sWhatsThis = "Std_LinkMakeRelative";
881
sStatusTip = QT_TR_NOOP("Actions that apply to link objects");
885
addCommand(new StdCmdLinkMake());
886
addCommand(new StdCmdLinkMakeRelative());
887
addCommand(new StdCmdLinkReplace());
888
addCommand(new StdCmdLinkUnlink());
889
addCommand(new StdCmdLinkImport());
890
addCommand(new StdCmdLinkImportAll());
893
const char* className() const override {return "StdCmdLinkActions";}
903
void CreateLinkCommands()
905
CommandManager &rcCmdMgr = Application::Instance->commandManager();
906
rcCmdMgr.addCommand(new StdCmdLinkActions());
907
rcCmdMgr.addCommand(new StdCmdLinkMakeGroup());
908
rcCmdMgr.addCommand(new StdCmdLinkSelectActions());