Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/foxtools/MFXLinkLabel.cpp
169678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2006-2025 German Aerospace Center (DLR) and others.
4
// This program and the accompanying materials are made available under the
5
// terms of the Eclipse Public License 2.0 which is available at
6
// https://www.eclipse.org/legal/epl-2.0/
7
// This Source Code may also be made available under the following Secondary
8
// Licenses when the conditions for such availability set forth in the Eclipse
9
// Public License 2.0 are satisfied: GNU General Public License, version 2
10
// or later which is available at
11
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
/****************************************************************************/
14
/// @file MFXLinkLabel.cpp
15
/// @author Daniel Krajzewicz
16
/// @author Michael Behrisch
17
/// @author Jakob Erdmann
18
/// @date 2006-03-08
19
///
20
//
21
/****************************************************************************/
22
23
/* =========================================================================
24
* included modules
25
* ======================================================================= */
26
#include <config.h>
27
28
#ifdef WIN32
29
#define NOMINMAX
30
#include <windows.h>
31
#undef NOMINMAX
32
#endif
33
34
#include <utils/gui/div/GUIDesigns.h>
35
36
#include "MFXLinkLabel.h"
37
38
39
FXint
40
MFXLinkLabel::fxexecute(FXString link) {
41
#ifdef WIN32
42
return (int)(intptr_t)ShellExecute(nullptr, "open", link.text(), nullptr, nullptr, SW_SHOWNORMAL) > 32 ? 1 : 0;
43
#else
44
FXString ext = FXPath::extension(link);
45
FXString list;
46
if (comparecase(link.section(':', 0), "http") == 0 ||
47
comparecase(link.section(':', 0), "https") == 0 ||
48
comparecase(link.section(':', 0), "ftp") == 0 ||
49
comparecase(ext, "htm") == 0 || comparecase(ext, "html") == 0 ||
50
comparecase(ext, "php") == 0 || comparecase(ext, "asp") == 0) {
51
list = "firefox\tchromium\tkonqueror\tdillo\tlynx\topen";
52
} else if (comparecase(ext, "pdf") == 0) {
53
list = "acroread\tkghostview\tgpdf\txpdf";
54
}
55
56
if (list.length()) {
57
FXString software;
58
FXint index = 0;
59
FXString path = FXSystem::getExecPath();
60
61
software = list.section("\t", index);
62
while (!software.empty()) {
63
software = FXPath::search(path, software);
64
if (software.length())
65
return system(FXString().format("%s \"%s\" >/dev/null 2>&1 & ",
66
software.text(), link.text()).text()) > 0 ? 0 : 1;
67
index++;
68
software = list.section("\t", index);
69
}
70
} else if (FXStat::isExecutable(link)) {
71
return system((link + " >/dev/null 2>&1 & ").text()) > 0 ? 0 : 1;
72
}
73
return 0;
74
#endif
75
}
76
77
78
79
FXDEFMAP(MFXLinkLabel) MFXLinkLabelMap[] = {
80
FXMAPFUNC(SEL_LEFTBUTTONPRESS, 0, MFXLinkLabel::onLeftBtnPress),
81
FXMAPFUNC(SEL_TIMEOUT, MFXLinkLabel::ID_TIMER, MFXLinkLabel::onTimer),
82
};
83
FXIMPLEMENT(MFXLinkLabel, FXLabel, MFXLinkLabelMap, ARRAYNUMBER(MFXLinkLabelMap))
84
85
86
MFXLinkLabel::MFXLinkLabel(FXComposite* p, const FXString& text, FXIcon* ic, FXuint opts, FXint x, FXint y, FXint w, FXint h, FXint pl, FXint pr, FXint pt, FXint pb) : FXLabel(p, text, ic, opts, x, y, w, h, pl, pr, pt, pb) {
87
setDefaultCursor(getApp()->getDefaultCursor(DEF_HAND_CURSOR));
88
setTextColor(GUIDesignTextColorBlue);
89
}
90
91
MFXLinkLabel::~MFXLinkLabel() {
92
getApp()->removeTimeout(this, ID_TIMER);
93
}
94
95
long MFXLinkLabel::onLeftBtnPress(FXObject*, FXSelector, void*) {
96
FXString link = getTipText();
97
if (link.length()) {
98
getApp()->beginWaitCursor();
99
if (fxexecute(link)) {
100
getApp()->addTimeout(this, ID_TIMER, 2000); // 2 seconds of way cursor
101
} else {
102
getApp()->endWaitCursor();
103
getApp()->beep();
104
}
105
}
106
return 1;
107
}
108
109
long MFXLinkLabel::onTimer(FXObject*, FXSelector, void*) {
110
getApp()->endWaitCursor();
111
return 1;
112
}
113
114