Line data Source code
1 : /****************************************************************************/
2 : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3 : // Copyright (C) 2006-2024 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 "MFXLinkLabel.h"
35 :
36 :
37 : FXint
38 0 : MFXLinkLabel::fxexecute(FXString link) {
39 : #ifdef WIN32
40 : return (int)(intptr_t)ShellExecute(nullptr, "open", link.text(), nullptr, nullptr, SW_SHOWNORMAL) > 32 ? 1 : 0;
41 : #else
42 0 : FXString ext = FXPath::extension(link);
43 0 : FXString list;
44 0 : if (comparecase(link.section(':', 0), "http") == 0 ||
45 0 : comparecase(link.section(':', 0), "https") == 0 ||
46 0 : comparecase(link.section(':', 0), "ftp") == 0 ||
47 0 : comparecase(ext, "htm") == 0 || comparecase(ext, "html") == 0 ||
48 0 : comparecase(ext, "php") == 0 || comparecase(ext, "asp") == 0) {
49 0 : list = "firefox\tchromium\tkonqueror\tdillo\tlynx\topen";
50 0 : } else if (comparecase(ext, "pdf") == 0) {
51 0 : list = "acroread\tkghostview\tgpdf\txpdf";
52 : }
53 :
54 0 : if (list.length()) {
55 0 : FXString software;
56 : FXint index = 0;
57 0 : FXString path = FXSystem::getExecPath();
58 :
59 0 : software = list.section("\t", index);
60 0 : while (!software.empty()) {
61 0 : software = FXPath::search(path, software);
62 0 : if (software.length())
63 0 : return system(FXString().format("%s \"%s\" >/dev/null 2>&1 & ",
64 0 : software.text(), link.text()).text()) > 0 ? 0 : 1;
65 0 : index++;
66 0 : software = list.section("\t", index);
67 : }
68 0 : } else if (FXStat::isExecutable(link)) {
69 0 : return system((link + " >/dev/null 2>&1 & ").text()) > 0 ? 0 : 1;
70 : }
71 : return 0;
72 : #endif
73 0 : }
74 :
75 :
76 :
77 : FXDEFMAP(MFXLinkLabel) MFXLinkLabelMap[] = {
78 : FXMAPFUNC(SEL_LEFTBUTTONPRESS, 0, MFXLinkLabel::onLeftBtnPress),
79 : FXMAPFUNC(SEL_TIMEOUT, MFXLinkLabel::ID_TIMER, MFXLinkLabel::onTimer),
80 : };
81 0 : FXIMPLEMENT(MFXLinkLabel, FXLabel, MFXLinkLabelMap, ARRAYNUMBER(MFXLinkLabelMap))
82 :
83 :
84 0 : 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) {
85 0 : setDefaultCursor(getApp()->getDefaultCursor(DEF_HAND_CURSOR));
86 0 : setTextColor(FXRGB(0, 0, 255));
87 0 : }
88 :
89 0 : MFXLinkLabel::~MFXLinkLabel() {
90 0 : getApp()->removeTimeout(this, ID_TIMER);
91 0 : }
92 :
93 0 : long MFXLinkLabel::onLeftBtnPress(FXObject*, FXSelector, void*) {
94 0 : FXString link = getTipText();
95 0 : if (link.length()) {
96 0 : getApp()->beginWaitCursor();
97 0 : if (fxexecute(link)) {
98 0 : getApp()->addTimeout(this, ID_TIMER, 2000); // 2 seconds of way cursor
99 : } else {
100 0 : getApp()->endWaitCursor();
101 0 : getApp()->beep();
102 : }
103 : }
104 0 : return 1;
105 0 : }
106 :
107 0 : long MFXLinkLabel::onTimer(FXObject*, FXSelector, void*) {
108 0 : getApp()->endWaitCursor();
109 0 : return 1;
110 : }
|