Skip to content

Commit 33383b0

Browse files
committed
Open links using java.awt.Desktop
1 parent 90219a9 commit 33383b0

File tree

7 files changed

+93
-64
lines changed

7 files changed

+93
-64
lines changed

tmc-plugin/src/fi/helsinki/cs/tmc/actions/OpenProfileAction.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package fi.helsinki.cs.tmc.actions;
22

33
import fi.helsinki.cs.tmc.ui.ConvenientDialogDisplayer;
4+
import fi.helsinki.cs.tmc.utilities.BrowserOpener;
45

56
import java.awt.event.ActionEvent;
6-
import java.net.MalformedURLException;
7-
import java.net.URL;
7+
import java.io.IOException;
8+
import java.net.URI;
9+
import java.net.URISyntaxException;
810
import javax.swing.AbstractAction;
911

1012
import org.openide.awt.ActionID;
1113
import org.openide.awt.ActionReference;
1214
import org.openide.awt.ActionReferences;
1315
import org.openide.awt.ActionRegistration;
14-
import org.openide.awt.HtmlBrowser;
1516
import org.openide.util.NbBundle;
1617

1718
@ActionID(category = "TMC",
@@ -26,10 +27,10 @@ public class OpenProfileAction extends AbstractAction {
2627
@Override
2728
public void actionPerformed(ActionEvent e) {
2829
try {
29-
HtmlBrowser.URLDisplayer.getDefault().showURLExternal(new URL("https://tmc.mooc.fi/participants/me"));
30-
} catch (MalformedURLException ex) {
30+
BrowserOpener.openUrl(URI.create("https://tmc.mooc.fi/participants/me"));
31+
} catch (URISyntaxException | IOException ex) {
3132
ConvenientDialogDisplayer.getDefault().displayError("Failed to open browser.\n" + ex.getMessage());
3233
}
3334
}
34-
35+
3536
}

tmc-plugin/src/fi/helsinki/cs/tmc/ui/AboutDialog.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package fi.helsinki.cs.tmc.ui;
22

3-
import java.net.MalformedURLException;
4-
import java.net.URL;
3+
import fi.helsinki.cs.tmc.utilities.BrowserOpener;
4+
5+
import java.io.IOException;
6+
import java.net.URI;
7+
import java.net.URISyntaxException;
58
import javax.swing.event.HyperlinkEvent;
69

7-
import org.openide.awt.HtmlBrowser;
810
import org.openide.windows.WindowManager;
911

1012
public class AboutDialog extends javax.swing.JDialog {
11-
13+
1214
public static void display() {
1315
AboutDialog dialog = new AboutDialog();
1416
dialog.setTitle("About");
@@ -19,14 +21,14 @@ public static void display() {
1921
public AboutDialog() {
2022
super(WindowManager.getDefault().getMainWindow(), false);
2123
initComponents();
22-
24+
2325
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
24-
26+
2527
this.infoTextPane.addHyperlinkListener((HyperlinkEvent e) -> {
2628
if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
2729
try {
28-
HtmlBrowser.URLDisplayer.getDefault().showURLExternal(new URL("https://mooc.fi/tmc"));
29-
} catch (MalformedURLException ex) {
30+
BrowserOpener.openUrl(URI.create("https://mooc.fi/tmc"));
31+
} catch (URISyntaxException | IOException ex) {
3032
ConvenientDialogDisplayer.getDefault().displayError("Failed to open browser.\n" + ex.getMessage());
3133
}
3234
}

tmc-plugin/src/fi/helsinki/cs/tmc/ui/CodeReviewDialog.java

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,52 @@
11
package fi.helsinki.cs.tmc.ui;
22

33
import fi.helsinki.cs.tmc.core.domain.Review;
4+
import fi.helsinki.cs.tmc.utilities.BrowserOpener;
45

56
import java.awt.Dimension;
67
import java.awt.Toolkit;
78
import java.awt.event.ActionListener;
8-
import java.net.MalformedURLException;
9-
import java.util.logging.Level;
9+
import java.io.IOException;
10+
import java.net.URISyntaxException;
1011
import java.util.logging.Logger;
12+
1113
import org.apache.commons.lang3.StringUtils;
12-
import org.openide.awt.HtmlBrowser;
1314

1415
public class CodeReviewDialog extends javax.swing.JDialog {
16+
1517
private static final Logger log = Logger.getLogger(CodeReviewDialog.class.getName());
16-
18+
1719
private Review review;
1820
private ActionListener okListener;
19-
21+
2022
public CodeReviewDialog(Review review) {
2123
this.review = review;
2224
this.okListener = null;
23-
25+
2426
initComponents();
25-
27+
2628
// Set location according to screen dimensions
2729
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
2830
this.setLocation(screenSize.width / 2 - (this.getWidth() / 2), screenSize.height / 2 - (this.getHeight() / 2));
29-
30-
31+
3132
this.setLocationByPlatform(true);
32-
33+
3334
this.setTitle("Code review - " + review.getExerciseName());
3435
titleLabel.setText("Code review - " + review.getExerciseName());
3536
reviewedByLabel.setText("Reviewed by " + review.getReviewerName());
3637
reviewArea.setText(review.getReviewBody());
3738
markAsReadCheckBox.setSelected(true);
3839
pointsLabel.setText(getPointsAwardedText(review));
3940
}
40-
41+
4142
public void setOkListener(ActionListener okListener) {
4243
this.okListener = okListener;
4344
}
44-
45+
4546
public boolean getMarkAsRead() {
4647
return markAsReadCheckBox.isSelected();
4748
}
48-
49+
4950
private String getPointsAwardedText(Review review) {
5051
StringBuilder sb = new StringBuilder();
5152
if (!review.getPoints().isEmpty()) {
@@ -56,12 +57,12 @@ private String getPointsAwardedText(Review review) {
5657
}
5758
return sb.toString();
5859
}
59-
60+
6061
private void openInBrowser() {
6162
try {
62-
HtmlBrowser.URLDisplayer.getDefault().showURLExternal(review.getUrl().toURL());
63-
} catch (MalformedURLException ex) {
64-
log.log(Level.WARNING, "Malformed URL: " + ex.getMessage(), ex);
63+
BrowserOpener.openUrl(review.getUrl());
64+
} catch (URISyntaxException | IOException ex) {
65+
ConvenientDialogDisplayer.getDefault().displayError("Failed to open browser.\n" + ex.getMessage());
6566
}
6667
}
6768

tmc-plugin/src/fi/helsinki/cs/tmc/ui/PastebinResponseDialog.java

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,19 @@
22

33
import static fi.helsinki.cs.tmc.ui.Boxer.hbox;
44
import static fi.helsinki.cs.tmc.ui.Boxer.hglue;
5+
6+
import fi.helsinki.cs.tmc.utilities.BrowserOpener;
7+
58
import java.awt.Component;
69
import java.awt.Dimension;
710
import java.awt.Toolkit;
811
import java.awt.datatransfer.Clipboard;
912
import java.awt.datatransfer.StringSelection;
1013
import java.awt.event.ActionEvent;
1114
import java.awt.event.ActionListener;
12-
import java.net.URL;
15+
import java.io.IOException;
16+
import java.net.URI;
17+
import java.net.URISyntaxException;
1318
import java.util.logging.Logger;
1419
import javax.swing.AbstractAction;
1520
import javax.swing.BorderFactory;
@@ -20,46 +25,45 @@
2025
import javax.swing.JLabel;
2126
import javax.swing.JPanel;
2227
import javax.swing.JTextField;
23-
import org.openide.awt.HtmlBrowser;
2428

2529
public class PastebinResponseDialog extends JDialog {
2630

2731
private static final Logger log = Logger.getLogger(PastebinResponseDialog.class.getName());
2832

2933
public PastebinResponseDialog(final String pasteUrl) {
3034
setTitle("Pastebin notification");
31-
35+
3236
// Set location according to screen dimensions
3337
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
3438
this.setLocation(screenSize.width / 2 - (this.getWidth() / 2), screenSize.height / 2 - (this.getHeight() / 2));
35-
39+
3640
JPanel contentPane = new JPanel();
3741
contentPane.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
3842
contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));
3943
setContentPane(contentPane);
40-
44+
4145
getContentPane().add(leftAligned(new JLabel("Code submitted to TMC pastebin.")));
4246
addVSpace(8);
4347
JButton viewPasteButton = new JButton(new AbstractAction("View paste") {
4448
@Override
45-
public void actionPerformed(ActionEvent ev) {
46-
try {
47-
HtmlBrowser.URLDisplayer.getDefault().showURLExternal(new URL(pasteUrl));
48-
} catch (Exception ex) {
49-
ConvenientDialogDisplayer.getDefault().displayError("Failed to open browser.\n" + ex.getMessage());
50-
}
49+
public void actionPerformed(ActionEvent ev) {
50+
try {
51+
BrowserOpener.openUrl(URI.create(pasteUrl));
52+
} catch (URISyntaxException | IOException ex) {
53+
ConvenientDialogDisplayer.getDefault().displayError("Failed to open browser.\n" + ex.getMessage());
5154
}
55+
}
5256
});
53-
57+
5458
getContentPane().add(leftAligned(viewPasteButton));
5559
addVSpace(8);
56-
60+
5761
final JTextField pasteUrlField = new JTextField(pasteUrl);
5862
pasteUrlField.setEditable(false);
5963
getContentPane().add(leftAligned(pasteUrlField));
60-
64+
6165
addVSpace(8);
62-
66+
6367
JButton okButton = new JButton("OK");
6468
okButton.addActionListener(new ActionListener() {
6569
@Override
@@ -69,28 +73,27 @@ public void actionPerformed(ActionEvent e) {
6973
}
7074
});
7175
getContentPane().add(hbox(hglue(), okButton));
72-
76+
7377
JButton copyToClipboardButton = new JButton("Copy to clipboard");
7478
copyToClipboardButton.addActionListener(new ActionListener() {
7579
@Override
7680
public void actionPerformed(ActionEvent e) {
77-
StringSelection stringSelection = new StringSelection(pasteUrl);
81+
StringSelection stringSelection = new StringSelection(pasteUrl);
7882
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
7983
clipboard.setContents(stringSelection, stringSelection);
8084
}
8185
});
8286
getContentPane().add(hbox(hglue(), copyToClipboardButton));
83-
87+
8488
pack();
85-
86-
8789

8890
}
91+
8992
//brutishly borrowed from SuccessfulSubmissionDialog
9093
private void addVSpace(int height) {
9194
add(Box.createVerticalStrut(height));
9295
}
93-
96+
9497
private Box leftAligned(Component component) {
9598
return hbox(component, hglue());
9699
}

tmc-plugin/src/fi/helsinki/cs/tmc/ui/SubmissionResultWaitingDialog.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
package fi.helsinki.cs.tmc.ui;
22

33
import fi.helsinki.cs.tmc.coreimpl.ManualProgressObserver;
4+
import fi.helsinki.cs.tmc.utilities.BrowserOpener;
5+
6+
import com.google.common.base.Optional;
47

58
import java.awt.event.ActionEvent;
69
import java.awt.Frame;
10+
import java.io.IOException;
711
import java.lang.reflect.InvocationTargetException;
812
import java.net.URI;
13+
import java.net.URISyntaxException;
914
import java.util.concurrent.atomic.AtomicReference;
1015
import javax.swing.AbstractAction;
1116
import javax.swing.JDialog;
1217
import javax.swing.SwingUtilities;
1318

14-
import com.google.common.base.Optional;
15-
16-
import org.openide.awt.HtmlBrowser;
1719
import org.openide.util.Cancellable;
1820
import org.openide.util.Exceptions;
1921
import org.openide.windows.WindowManager;
@@ -75,8 +77,8 @@ public void showSubmissionButton(URI showSubmissionUrl) {
7577
@Override
7678
public void actionPerformed(ActionEvent ae) {
7779
try {
78-
HtmlBrowser.URLDisplayer.getDefault().showURLExternal(showSubmissionUrl.toURL());
79-
} catch (Exception ex) {
80+
BrowserOpener.openUrl(showSubmissionUrl);
81+
} catch (URISyntaxException | IOException ex) {
8082
ConvenientDialogDisplayer.getDefault().displayError("Failed to open browser.\n" + ex.getMessage());
8183
}
8284
}

tmc-plugin/src/fi/helsinki/cs/tmc/ui/SuccessfulSubmissionDialog.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@
66
import fi.helsinki.cs.tmc.core.domain.submission.FeedbackQuestion;
77
import fi.helsinki.cs.tmc.ui.feedback.FeedbackQuestionPanel;
88
import fi.helsinki.cs.tmc.ui.feedback.FeedbackQuestionPanelFactory;
9+
import fi.helsinki.cs.tmc.utilities.BrowserOpener;
910

1011
import com.google.common.base.Optional;
1112

1213
import java.awt.Component;
1314
import java.awt.Font;
1415
import java.awt.event.ActionEvent;
1516
import java.awt.event.ActionListener;
16-
import java.net.MalformedURLException;
17+
import java.io.IOException;
1718
import java.net.URI;
18-
import java.net.URL;
19+
import java.net.URISyntaxException;
1920
import java.util.ArrayList;
2021
import java.util.List;
2122
import java.util.logging.Logger;
@@ -30,7 +31,6 @@
3031

3132
import org.apache.commons.lang3.StringEscapeUtils;
3233
import org.apache.commons.lang3.StringUtils;
33-
import org.openide.awt.HtmlBrowser;
3434

3535
import static fi.helsinki.cs.tmc.ui.Boxer.hbox;
3636
import static fi.helsinki.cs.tmc.ui.Boxer.hglue;
@@ -135,8 +135,8 @@ private void addModelSolutionButton(SubmissionResult result) {
135135
@Override
136136
public void actionPerformed(ActionEvent ev) {
137137
try {
138-
HtmlBrowser.URLDisplayer.getDefault().showURLExternal(new URL(solutionUrl));
139-
} catch (MalformedURLException ex) {
138+
BrowserOpener.openUrl(URI.create(solutionUrl));
139+
} catch (URISyntaxException | IOException ex) {
140140
ConvenientDialogDisplayer.getDefault().displayError("Failed to open browser.\n" + ex.getMessage());
141141
}
142142
}
@@ -205,8 +205,8 @@ private void addShowSubmissionButton(JPanel buttonPane, Optional<URI> submission
205205
@Override
206206
public void actionPerformed(ActionEvent ae) {
207207
try {
208-
HtmlBrowser.URLDisplayer.getDefault().showURLExternal(submissionUrl.get().toURL());
209-
} catch (MalformedURLException ex) {
208+
BrowserOpener.openUrl(submissionUrl.get());
209+
} catch (URISyntaxException | IOException ex) {
210210
ConvenientDialogDisplayer.getDefault().displayError("Failed to open browser.\n" + ex.getMessage());
211211
}
212212
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package fi.helsinki.cs.tmc.utilities;
2+
3+
import java.awt.Desktop;
4+
import java.io.IOException;
5+
import java.net.URISyntaxException;
6+
import java.net.URI;
7+
8+
import org.openide.awt.HtmlBrowser;
9+
10+
public class BrowserOpener {
11+
12+
public static void openUrl(URI url) throws URISyntaxException, IOException {
13+
if (Desktop.isDesktopSupported()) {
14+
Desktop desktop = Desktop.getDesktop();
15+
desktop.browse(url);
16+
} else {
17+
HtmlBrowser.URLDisplayer.getDefault().showURLExternal(url.toURL());
18+
}
19+
}
20+
}

0 commit comments

Comments
 (0)