1
0
Fork 0
libreoffice/scripting/examples/java/Newsgroup/PostNewsgroup.java
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

633 lines
23 KiB
Java

/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
package org.libreoffice.example.java_scripts;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.Vector;
import com.sun.star.script.framework.runtime.XScriptContext;
public class PostNewsgroup extends JFrame {
// Post to newsgroup objects
private NewsGroup[] subscribedNewsgroups = null;
private XScriptContext xscriptcontext = null;
private final int FRAMEX = 300;
private final int FRAMEY = 300;
private final int TEXTBOXWIDTH = 300;
private final int TEXTBOXHEIGHT = 24;
private final int TEXTAREAHEIGHT = 70;
private final int BUTTONWIDTH = 80;
private final int BUTTONHEIGHT = 30;
private PostNewsgroup window = null;
private JComboBox newsgroupComboBox = null;
private JTextField hostTextField = null;
private JTextField replyTextField = null;
private JTextField subjectTextField = null;
private JTextArea commentTextArea = null;
private JRadioButton officeHtmlButton = null;
private JRadioButton officeButton = null;
private JRadioButton htmlButton = null;
private JButton postButton = null;
private JButton cancelButton = null;
// JFrame for launch progress dialog
private StatusWindow statusWindow = null;
private String statusLine = "";
// Tool tip text
private final String newsgroupText = "Newsgroup name";
private final String hostText = "Newsgroup host/server name";
private final String replyText = "Email address to reply to";
private final String subjectText = "Subject title for the mail";
private final String commentText = "Additional comment on mail";
private final String officeHtmlText =
"Post as both Office and HTML attachments";
private final String officeText = "Post as Office attachment only";
private final String htmlText = "Post as HTML attachment only";
private final String postText = "Post to newsgroup";
private final String cancelText = "Cancel post to newsgroup";
public void post(XScriptContext xsc) {
xscriptcontext = xsc;
window = this;
// create mailcap and mimetypes files (fix for classloader problem)
MimeConfiguration.createFiles(xscriptcontext);
this.setTitle("Post Document To Newsgroup");
this.setLocation(FRAMEX, FRAMEY);
this.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent event) {
System.out.println("Focus gained");
window.update(window.getGraphics());
}
public void focusLost(FocusEvent event) {
System.out.println("Focus lost");
}
});
Container container = getContentPane();
container.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
JPanel labelPanel = constructLabelPanel();
JPanel textPanel = constructTextPanel();
JPanel optionPanel = constructOptionPanel();
JPanel buttonPanel = constructButtonPanel();
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 3;
constraints.insets = new Insets(15, 15, 5, 5);
container.add(labelPanel, constraints);
constraints.gridx = 1;
constraints.gridy = 0;
constraints.gridwidth = 4;
constraints.gridheight = 3;
constraints.insets = new Insets(15, 5, 5, 15);
container.add(textPanel, constraints);
constraints.gridx = 0;
constraints.gridy = 3;
constraints.gridwidth = 5;
constraints.gridheight = 1;
constraints.insets = new Insets(5, 15, 5, 15);
container.add(optionPanel, constraints);
constraints.gridx = 0;
constraints.gridy = 4;
constraints.gridwidth = 5;
constraints.gridheight = 1;
constraints.insets = new Insets(5, 5, 5, 5);
container.add(buttonPanel, constraints);
this.pack();
this.setResizable(false);
this.setVisible(true);
}
private JPanel constructLabelPanel() {
JLabel newsgroupLabel = new JLabel("Newsgroup:");
JLabel hostLabel = new JLabel("Host:");
JLabel replyLabel = new JLabel("Reply:");
JLabel subjectLabel = new JLabel("Subject:");
JLabel commentLabel = new JLabel("Comment:");
newsgroupLabel.setToolTipText(newsgroupText);
hostLabel.setToolTipText(hostText);
replyLabel.setToolTipText(replyText);
subjectLabel.setToolTipText(subjectText);
commentLabel.setToolTipText(commentText);
JPanel newsgroupPanel = new JPanel();
newsgroupPanel.setLayout(new BorderLayout());
newsgroupPanel.add(newsgroupLabel, "West");
JPanel hostPanel = new JPanel();
hostPanel.setLayout(new BorderLayout());
hostPanel.add(hostLabel, "West");
JPanel replyPanel = new JPanel();
replyPanel.setLayout(new BorderLayout());
replyPanel.add(replyLabel, "West");
JPanel subjectPanel = new JPanel();
subjectPanel.setLayout(new BorderLayout());
subjectPanel.add(subjectLabel, "West");
JPanel commentPanel = new JPanel();
commentPanel.setLayout(new BorderLayout());
commentPanel.add(commentLabel, "West");
JPanel emptyPanel = new JPanel();
final int labelWidth = 80;
newsgroupPanel.setPreferredSize(new Dimension(labelWidth, TEXTBOXHEIGHT));
hostPanel.setPreferredSize(new Dimension(labelWidth, TEXTBOXHEIGHT));
replyPanel.setPreferredSize(new Dimension(labelWidth, TEXTBOXHEIGHT));
subjectPanel.setPreferredSize(new Dimension(labelWidth, TEXTBOXHEIGHT));
commentPanel.setPreferredSize(new Dimension(labelWidth, TEXTBOXHEIGHT));
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.insets = new Insets(5, 5, 5, 5);
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = constraints.weighty = 0.0;
panel.add(newsgroupPanel, constraints);
constraints.gridx = 0;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
panel.add(hostPanel, constraints);
constraints.gridx = 0;
constraints.gridy = 2;
constraints.gridwidth = 1;
constraints.gridheight = 1;
panel.add(replyPanel, constraints);
constraints.gridx = 0;
constraints.gridy = 3;
constraints.gridwidth = 1;
constraints.gridheight = 1;
panel.add(subjectPanel, constraints);
constraints.gridx = 0;
constraints.gridy = 4;
constraints.gridwidth = 1;
constraints.gridheight = 1;
panel.add(commentPanel, constraints);
constraints.gridx = 0;
constraints.gridy = 5;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.weightx = constraints.weighty = 1.0;
panel.add(emptyPanel, constraints);
return panel;
}
private JPanel constructTextPanel() {
hostTextField = new JTextField();
hostTextField.setPreferredSize(new Dimension(TEXTBOXWIDTH, TEXTBOXHEIGHT));
hostTextField.setToolTipText(hostText);
hostTextField.setBorder(new EtchedBorder());
//optionPanel.setBorder( new TitledBorder( new EtchedBorder(), "Document Format" ) );
newsgroupComboBox = getNewsgroupCombo();
replyTextField = new JTextField();
replyTextField.setPreferredSize(new Dimension(TEXTBOXWIDTH, TEXTBOXHEIGHT));
replyTextField.setToolTipText(replyText);
replyTextField.setBorder(new EtchedBorder());
subjectTextField = new JTextField();
subjectTextField.setPreferredSize(new Dimension(TEXTBOXWIDTH, TEXTBOXHEIGHT));
subjectTextField.setToolTipText(subjectText);
subjectTextField.setBorder(new EtchedBorder());
commentTextArea = new JTextArea();
commentTextArea.setPreferredSize(new Dimension(TEXTBOXWIDTH, TEXTAREAHEIGHT));
commentTextArea.setToolTipText(commentText);
commentTextArea.setBorder(new EtchedBorder());
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.insets = new Insets(5, 5, 5, 5);
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
panel.add(newsgroupComboBox, constraints);
constraints.gridx = 0;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
panel.add(hostTextField, constraints);
constraints.gridx = 0;
constraints.gridy = 2;
constraints.gridwidth = 1;
constraints.gridheight = 1;
panel.add(replyTextField, constraints);
constraints.gridx = 0;
constraints.gridy = 3;
constraints.gridwidth = 1;
constraints.gridheight = 1;
panel.add(subjectTextField, constraints);
constraints.gridx = 0;
constraints.gridy = 4;
constraints.gridwidth = 1;
constraints.gridheight = 2;
panel.add(commentTextArea, constraints);
return panel;
}
private JComboBox getNewsgroupCombo() {
newsgroupComboBox = new JComboBox();
//newsgroupComboBox.setBorder( new EtchedBorder() );
newsgroupComboBox.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// when newsgroup is selected
if (subscribedNewsgroups != null) {
int position = newsgroupComboBox.getSelectedIndex();
if (position != -1) {
hostTextField.setText(subscribedNewsgroups[ position ].getHostName());
newsgroupComboBox.setToolTipText("Newsgroup name: " +
subscribedNewsgroups[ position ].getNewsgroupName() + " (Host name: " +
subscribedNewsgroups[ position ].getHostName() + ")");
}
}
}
});
NewsGroup groupToSend = null;
SubscribedNewsgroups newsgroups = new SubscribedNewsgroups();
subscribedNewsgroups = newsgroups.getNewsGroups();
// Test for no .mozilla or no subscribed newsgroups
// subscribedNewsgroups = null;
if (subscribedNewsgroups == null) {
JOptionPane.showMessageDialog(window,
"No subscribed newsgroups found in mozilla/netscape profile \nPlease enter newsgroup and host name",
"Newsgroups Information", JOptionPane.INFORMATION_MESSAGE);
} else {
// Copy all newsgroups into a vector for comparison
// Alter entries (to include host name) if duplication is found
ArrayList vector = new ArrayList(subscribedNewsgroups.length);
for (int i = 0; i < subscribedNewsgroups.length; i++) {
vector.add(subscribedNewsgroups[i].getNewsgroupName());
}
// Compare and alter
for (int i = 0; i < subscribedNewsgroups.length; i++) {
// check if combo box already has a newsgroup with same name
// then add host name to differentiate
for (int j = 0; j < subscribedNewsgroups.length; j++) {
if (j != i
&& subscribedNewsgroups[j].getNewsgroupName().equalsIgnoreCase(
subscribedNewsgroups[i].getNewsgroupName())) {
vector.set(j, subscribedNewsgroups[j].getNewsgroupName() + " (" +
subscribedNewsgroups[j].getHostName() + ")");
vector.set(i, subscribedNewsgroups[i].getNewsgroupName() + " (" +
subscribedNewsgroups[i].getHostName() + ")");
}
}
}
// Copy converted newsgroups from vector to combo box
for (int i = 0; i < subscribedNewsgroups.length; i++) {
newsgroupComboBox.addItem(vector.elementAt(i));
}
}// else
newsgroupComboBox.setPreferredSize(new Dimension(TEXTBOXWIDTH, TEXTBOXHEIGHT));
newsgroupComboBox.setEditable(true);
return newsgroupComboBox;
}
private JPanel constructOptionPanel() {
officeHtmlButton = new JRadioButton("Office and HTML", true);
officeHtmlButton.setToolTipText(officeHtmlText);
officeButton = new JRadioButton("Office");
officeButton.setToolTipText(officeText);
htmlButton = new JRadioButton("HTML");
htmlButton.setToolTipText(htmlText);
JRadioButton[] rbuttons = { officeHtmlButton, officeButton, htmlButton };
ButtonGroup radioButtonGroup = new ButtonGroup();
for (int i = 0; i < rbuttons.length; i++) {
radioButtonGroup.add(rbuttons[i]);
}
JPanel optionPanel = new JPanel();
optionPanel.setBorder(new TitledBorder(new EtchedBorder(), "Document Format"));
optionPanel.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.insets = new Insets(5, 5, 5, 30);
optionPanel.add(officeHtmlButton, constraints);
constraints.gridx = 1;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.insets = new Insets(5, 20, 5, 30);
optionPanel.add(officeButton, constraints);
constraints.gridx = 2;
constraints.gridy = 0;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.insets = new Insets(5, 20, 5, 5);
optionPanel.add(htmlButton, constraints);
return optionPanel;
}
public boolean sendingActions() {
// posting actions
// Validate the data
if (isValidData()) {
// Create status window
StatusWindow statusWindow = new StatusWindow(window, "Posting to Newsgroup",
FRAMEX, FRAMEY);
statusWindow.setVisible(true);
statusLine = "Ready to send...";
statusWindow.setStatus(0, statusLine);
// Get the boolean values for HTML/Office document
// params: ( XScriptContext, StatusWindow, html document, office document )
boolean html = false;
boolean office = false;
if (officeHtmlButton.isSelected()) {
html = true;
office = true;
}
if (officeButton.isSelected()) {
office = true;
html = false;
}
if (htmlButton.isSelected()) {
html = true;
office = false;
}
OfficeAttachment officeAttach = new OfficeAttachment(xscriptcontext,
statusWindow, html, office);
statusLine = "Getting user input";
statusWindow.setStatus(2, statusLine);
// Get replyto, subject, comment from textboxes
String replyto = replyTextField.getText();
String subject = subjectTextField.getText();
String comment = commentTextArea.getText();
// Get newsgroup from combo box (corresponding position)
String host = "";
String group = "";
int position = newsgroupComboBox.getSelectedIndex();
if (subscribedNewsgroups == null || position == -1) {
host = hostTextField.getText();
group = newsgroupComboBox.getSelectedItem().toString();
} else {
host = subscribedNewsgroups[ position ].getHostName();
group = subscribedNewsgroups[ position ].getNewsgroupName();
}
statusLine = "Creating sender object";
statusWindow.setStatus(3, statusLine);
Sender sender = new Sender(statusWindow, officeAttach, replyto, subject,
comment, host, group);
if (!sender.sendMail()) {
statusWindow.enableCancelButton(true);
officeAttach.cleanUpOnError();
return false;
}
statusLine = "Send is complete";
statusWindow.setStatus(14, statusLine);
} else {
return false;
}
return true;
}
private JPanel constructButtonPanel() {
Action postAction = new AbstractAction() {
public void actionPerformed(ActionEvent event) {
// posting actions
sendingActions();
}// actionPerformed
};
Action cancelAction = new AbstractAction() {
public void actionPerformed(ActionEvent event) {
// cancelling actions
window.dispose();
}
};
postButton = new JButton();
postButton.setAction(postAction);
postButton.setToolTipText(postText);
postButton.setText("Post");
postButton.setPreferredSize(new Dimension(BUTTONWIDTH + 20, BUTTONHEIGHT));
cancelButton = new JButton();
cancelButton.setAction(cancelAction);
cancelButton.setToolTipText(cancelText);
cancelButton.setText("Cancel");
cancelButton.setPreferredSize(new Dimension(BUTTONWIDTH + 20, BUTTONHEIGHT));
JSeparator sep = new JSeparator(SwingConstants.HORIZONTAL);
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
constraints.insets = new Insets(5, 5, 5, 5);
JPanel emptyPanel1 = new JPanel();
emptyPanel1.setPreferredSize(new Dimension(BUTTONWIDTH, BUTTONHEIGHT));
JPanel emptyPanel2 = new JPanel();
emptyPanel2.setPreferredSize(new Dimension(BUTTONWIDTH, BUTTONHEIGHT));
constraints.gridx = 0;
constraints.gridy = 0;
constraints.gridwidth = 4;
constraints.gridheight = 1;
buttonPanel.add(sep, constraints);
constraints.gridx = 0;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
buttonPanel.add(emptyPanel1, constraints);
constraints.gridx = 1;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
buttonPanel.add(emptyPanel2, constraints);
constraints.gridx = 2;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
buttonPanel.add(postButton, constraints);
constraints.gridx = 3;
constraints.gridy = 1;
constraints.gridwidth = 1;
constraints.gridheight = 1;
constraints.insets = new Insets(5, 5, 5, 0);
buttonPanel.add(cancelButton, constraints);
return buttonPanel;
}
public void enableButtons(boolean enable) {
if (enable) {
postButton.setEnabled(true);
cancelButton.setEnabled(true);
} else {
postButton.setEnabled(false);
cancelButton.setEnabled(false);
}
}
private boolean isValidData() {
// newsgroupComboBox must not be blank (format? dots and whitespace)
String newsgroupString = "";
int position = newsgroupComboBox.getSelectedIndex();
if (subscribedNewsgroups == null || position == -1) {
newsgroupString = newsgroupComboBox.getSelectedItem().toString();
} else {
newsgroupString = subscribedNewsgroups[ position ].getNewsgroupName();
}
if (newsgroupString.length() == 0) {
newsgroupComboBox.requestFocus();
JOptionPane.showMessageDialog(window, "Please enter a newsgroup name",
"Input Error", JOptionPane.ERROR_MESSAGE);
return false;
}
// hostTextField must not be blank (format?)
String hostString = hostTextField.getText();
if (hostString.length() == 0) {
hostTextField.requestFocus();
JOptionPane.showMessageDialog(window, "Please enter a hostname", "Input Error",
JOptionPane.ERROR_MESSAGE);
return false;
}
// replyTextField must have <string>@<string>.<string>
// (string at least 2 chars long)
// consider <s>.<s>@<s>.<s>.<s> format? (array of dot positions?)
String replyString = replyTextField.getText();
int atPos = replyString.indexOf("@");
int dotPos = replyString.lastIndexOf(".");
int length = replyString.length();
if (length == 0 || atPos == -1 || dotPos == -1 || atPos < 2 || dotPos < atPos
|| dotPos + 2 == length || atPos + 2 == dotPos
|| atPos != replyString.lastIndexOf("@") || replyString.indexOf(" ") != -1) {
replyTextField.requestFocus();
JOptionPane.showMessageDialog(window,
"Please enter a valid reply to email address", "Input Error",
JOptionPane.ERROR_MESSAGE);
return false;
}
// subjectTextField must not be blank?
String subjectString = subjectTextField.getText();
if (subjectString.length() == 0) {
subjectTextField.requestFocus();
JOptionPane.showMessageDialog(window, "Please enter subject title",
"Input Error", JOptionPane.ERROR_MESSAGE);
return false;
}
// details are valid
return true;
}
}