diff options
author | Kurt Zenker <kz@openoffice.org> | 2004-05-19 12:11:42 +0000 |
---|---|---|
committer | Kurt Zenker <kz@openoffice.org> | 2004-05-19 12:11:42 +0000 |
commit | 0dcd4aa16fce263a7e31790df4e4a4bf209fb888 (patch) | |
tree | 17908229b0a2b97675a503ce24f10db58300be2a /wizards/com/sun/star | |
parent | 49414548ce17a3321a36dd84c8ef5ac4a912dd78 (diff) |
INTEGRATION: CWS qwizards1 (1.1.2); FILE ADDED
2004/05/11 12:13:10 rpiterman 1.1.2.11: bugfix: added ":" after "HID" in helpURL of 3 text boxes
Issue number: 116731
2004/05/05 19:16:07 rpiterman 1.1.2.10: Changed HIDs
Added own Frame as house-pet
Issue number:
Submitted by:
Reviewed by:
2004/03/19 09:35:58 rpiterman 1.1.2.9: fixed thread bug, which did not enable dialogs to function properly as OOo Component
Issue number:
Submitted by:
Reviewed by:
2004/03/12 16:16:55 rpiterman 1.1.2.8: documentation and small implementation-fixes
2004/03/11 12:45:03 rpiterman 1.1.2.7: changed to use FileAccess.connectURLs(folder,filename) static method
2004/03/10 11:18:50 rpiterman 1.1.2.6: bugfix: password textbox properties order
2004/03/10 11:10:12 rpiterman 1.1.2.5: added support for HelpURL
2004/03/05 19:11:49 rpiterman 1.1.2.4: Further developement
2004/02/20 18:11:11 rpiterman 1.1.2.3: changes were made to use the Field Support of the DataAware model (beta)
2004/02/13 15:46:10 rpiterman 1.1.2.2: Further Developement
2004/02/10 18:40:56 rpiterman 1.1.2.1: Web Wizard Ftp dialog
Diffstat (limited to 'wizards/com/sun/star')
-rw-r--r-- | wizards/com/sun/star/wizards/web/FTPDialog.java | 644 |
1 files changed, 644 insertions, 0 deletions
diff --git a/wizards/com/sun/star/wizards/web/FTPDialog.java b/wizards/com/sun/star/wizards/web/FTPDialog.java new file mode 100644 index 000000000000..575e69c69cf4 --- /dev/null +++ b/wizards/com/sun/star/wizards/web/FTPDialog.java @@ -0,0 +1,644 @@ +/************************************************************************* + * + * $RCSfile: FTPDialog.java,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: kz $ $Date: 2004-05-19 13:11:42 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + */ + +package com.sun.star.wizards.web; + +import java.util.List; +import java.util.Vector; + +import com.sun.star.awt.*; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.ucb.*; +import com.sun.star.wizards.common.*; +import com.sun.star.wizards.ui.*; +import com.sun.star.wizards.ui.event.DataAware; +import com.sun.star.wizards.ui.event.UnoDataAware; +import com.sun.star.wizards.web.data.CGPublish; +import com.sun.star.wizards.web.data.CGSettings; + +/** + * This is the FTP Dialog. <br/> + * The Dialog enables the user: + * (*) entering FTP server and user information. + * (*) testing the connection. + * (*) choosing a directory on the server. + * If a connection was established succesfully, the user may + * press OK, which will change + * the CGPublish object propertiers according the user's input. + * If no connection was established. the OK and Choose-Dir button are disabled. + * See the method "disconnect()" which disables them. + * + * I use here the DataAware concept to automatically update + * the members ip, username, and password (via the methods setXXX(...)) + * for details see the ui.events.DataAware classes. <br/> + */ +public class FTPDialog extends UnoDialog2 implements UIConsts, WWHID { + + /** + * A Constant used for the setLabel(int) method to change the + * status-display. "unknown" is the status when the user first + * opens the dialog, or changes the servername/username/password. + */ + private final static int STATUS_UNKONWN= 0; + /** + * A Constant used for the setLabel(int) method to change the + * status-display. (connection established) + */ + private final static int STATUS_OK = 1; + /** + * A Constant used for the setLabel(int) method to change the + * status-display. + */ + private final static int STATUS_USER_PWD_WRONG = 2; + /** + * A Constant used for the setLabel(int) method to change the + * status-display. + */ + private final static int STATUS_SERVER_NOT_FOUND = 3; + /** + * A Constant used for the setLabel(int) method to change the + * status-display. + */ + private final static int STATUS_NO_RIGHTS = 4; + /** + * A Constant used for the setLabel(int) method to change the + * status-display. + */ + private final static int STATUS_HOST_UNREACHABLE = 5; + /** + * A Constant used for the setLabel(int) method to change the + * status-display. + */ + private final static int STATUS_CONNECTING = 6; + + /** + * The icon url for error + */ + private final static String ICON_ERROR = "ftperror.gif"; + /** + * The icon url for ok (connection ok) + */ + private final static String ICON_OK = "ftpconnected.gif"; + /** + * The icon url for unknown - this is the status when + * the user first opens the dialog + */ + private final static String ICON_UNKNOWN= "ftpunknown.gif"; + /** + * The icon url for an icon representing the "connecting" state. + */ + private final static String ICON_CONNECTING = "ftpconnecting.gif"; + + + //GUI Components as Class members. + //Fixed Line + private XControl ln1; + private XFixedText lblFTPAddress; + private XTextComponent txtHost; + private XFixedText lblUsername; + private XTextComponent txtUsername; + private XFixedText lblPassword; + private XTextComponent txtPassword; + //Fixed Line + private XControl ln2; + private XButton btnTestConnection; + private XControl imgStatus; + private XFixedText lblStatus; + //Fixed Line + private XControl ln3; + private XTextComponent txtDir; + private XButton btnDir; + private XButton btnOK; + private XButton btnCancel; + private XButton btnHelp; + //Font Descriptors as Class members. + + //Resources Object + private FTPDialogResources resources; + + private List dataAware = new Vector(); + + public String username = ""; + public String password = ""; + /** + * The ftp host name + */ + public String host = ""; + /** + * The ftp directory. + */ + private String dir = ""; + + /** + * the ftp publish object which contains the + * data for this dialog. + */ + private CGPublish publish; + private UCB ucb; + /** + * used for the status images url. + */ + private String imagesDirectory; + + /** + * constructor. + * constructs the UI. + * @param xmsf + * @param p the publishert object that contains the data + * for this dialog + * @throws Exception + */ + + public FTPDialog(XMultiServiceFactory xmsf, CGPublish p) throws Exception { + super(xmsf); + publish = p; + + + imagesDirectory = FileAccess.connectURLs(((CGSettings)(publish.root)).soTemplateDir, "wizard/bitmap/"); + + //Load Resources + resources = new FTPDialogResources(xmsf); + ucb = new UCB(xmsf); + + //set dialog properties... + Helper.setUnoPropertyValues(xDialogModel, + new String[] { "Closeable", "Height", "HelpURL", "Moveable", "Name", "PositionX", "PositionY", "Title", "Width" }, + new Object[] { Boolean.TRUE, new Integer(160), "HID:" + HID_FTP , Boolean.TRUE, "FTPDialog", new Integer(167), new Integer(82), resources.resFTPDialog_title, new Integer(222)}); + + //add controls to dialog + build(); + //make the hostname, username and password textfield data-aware. + configure(); + //make sure we display a disconnected status. + disconnect(); + } + + /** + * Add controls to dialog. + */ + public void build() { + final String[] PROPNAMES_LABEL = new String[] { "Height", "Label", "Name", "PositionX", "PositionY", "TabIndex", "Width" }; + final String[] PROPNAMES_BUTTON = new String[] { "Height", "HelpURL", "Label", "Name", "PositionX", "PositionY", "TabIndex", "Width"}; + final String[] PROPNAMES_BUTTON2 = new String[] { "Height", "HelpURL", "Label", "Name", "PositionX", "PositionY", "PushButtonType", "TabIndex", "Width"}; + + ln1 = insertFixedLine("ln1", + PROPNAMES_LABEL, + new Object[] { INTEGERS[8], resources.resln1_value, "ln1", INTEGERS[6], INTEGERS[6], new Short((short) 0), new Integer(210)}); + lblFTPAddress = insertLabel("lblFTPAddress", + PROPNAMES_LABEL, + new Object[] { INTEGERS[8], resources.reslblFTPAddress_value, "lblFTPAddress", INTEGER_12, new Integer(20), new Short((short) 1), new Integer(95)}); + txtHost = insertTextField("txtHost", "disconnect", + new String[] { "Height", "HelpURL", "Name", "PositionX", "PositionY", "TabIndex", "Width" }, + new Object[] { INTEGER_12, "HID:" + HID_FTP_SERVER, "txtIP", new Integer(110), new Integer(18), new Short((short) 2), new Integer(106)}); + lblUsername = insertLabel("lblUsername", + PROPNAMES_LABEL, + new Object[] { INTEGERS[8], resources.reslblUsername_value, "lblUsername", INTEGER_12, new Integer(36), new Short((short) 3), new Integer(85)}); + txtUsername = insertTextField("txtUsername", "disconnect", + new String[] { "Height", "HelpURL", "Name", "PositionX", "PositionY", "TabIndex", "Width" }, + new Object[] { INTEGER_12, "HID:" + HID_FTP_USERNAME , "txtUsername", new Integer(110), new Integer(34), new Short((short) 4), new Integer(106)}); + lblPassword = insertLabel("lblPassword", + PROPNAMES_LABEL, + new Object[] { INTEGERS[8], resources.reslblPassword_value, "lblPassword", INTEGER_12, new Integer(52), new Short((short) 5), new Integer(85)}); + txtPassword = insertTextField("txtPassword", "disconnect", + new String[] { "EchoChar", "Height", "HelpURL","Name", "PositionX", "PositionY", "TabIndex", "Width" }, + new Object[] { new Short((short) 42), INTEGER_12, "HID:" + HID_FTP_PASS, "txtPassword", new Integer(110), new Integer(50), new Short((short) 6), new Integer(106)}); + ln2 = insertFixedLine("ln2", + PROPNAMES_LABEL, + new Object[] { INTEGERS[8], resources.resln2_value, "ln2", INTEGERS[6], new Integer(68), new Short((short) 7), new Integer(210)}); + btnTestConnection = insertButton("btnConnect", "connect", + PROPNAMES_BUTTON, + new Object[] { INTEGER_14, "HID:" + HID_FTP_TEST, resources.resbtnConnect_value, "btnConnect", INTEGER_12, new Integer(80), new Short((short) 8), INTEGER_40 }); + + imgStatus = insertImage("imgStatus", + new String[] { "Border", "Height", "PositionX", "PositionY", "ScaleImage", "Tabstop", "Width" }, + new Object[] { new Short((short) 0), INTEGER_14, new Integer(58), new Integer(80), Boolean.FALSE, Boolean.FALSE, INTEGER_14 }); + + lblStatus = insertLabel("lblStatus", + PROPNAMES_LABEL, + new Object[] { INTEGERS[8], resources.resFTPDisconnected, "lblStatus", new Integer(76), new Integer(82), new Short((short) 9), new Integer(109)}); + + ln3 = insertFixedLine("ln3", + PROPNAMES_LABEL, + new Object[] { INTEGERS[8], resources.resln3_value, "ln3", INTEGERS[6], new Integer(100), new Short((short) 10), new Integer(210)}); + + txtDir = insertTextField("txtDir", + null, new String[] { "Enabled", "Height", "HelpURL", "Name", "PositionX", "PositionY", "TabIndex", "Text", "Width" }, + new Object[] { new Boolean(false), INTEGER_12, "HID:" + HID_FTP_TXT_PATH, "txtDir", INTEGER_12, new Integer(113), new Short((short) 11), resources.restxtDir_value, new Integer(184)}); + btnDir = insertButton("btnDir", "chooseDirectory", + PROPNAMES_BUTTON, + new Object[] { INTEGER_14, "HID:" + HID_FTP_BTN_PATH, resources.resbtnDir_value, "btnDir", new Integer(199), new Integer(112), new Short((short) 12), INTEGER_16 }); + + btnOK = insertButton("btnOK", null, + PROPNAMES_BUTTON2, + new Object[] { INTEGER_14, "HID:" + HID_FTP_OK, resources.resbtnOK_value, "btnOK", new Integer(175), new Integer(142), new Short((short) PushButtonType.OK_value), new Short((short) 13), INTEGER_40 }); + + btnCancel = insertButton("btnCancel", + null, PROPNAMES_BUTTON2, + new Object[] { INTEGER_14, "HID:" + HID_FTP_CANCEL, resources.resbtnCancel_value, "btnCancel", new Integer(133), new Integer(142), new Short((short) PushButtonType.CANCEL_value), new Short((short) 14), INTEGER_40 }); + + btnHelp = insertButton("btnHelp", null, + PROPNAMES_BUTTON2 , + new Object[] { INTEGER_14,"", resources.resbtnHelp_value, "btnHelp", new Integer(87), new Integer(142), new Short((short) PushButtonType.HELP_value), new Short((short) 15), INTEGER_40 }); + + } + + /** + * Make hostname, username and password text fields data aware. + */ + private void configure() { + dataAware.add(UnoDataAware.attachEditControl(this, "host", txtHost, null,true)); + dataAware.add(UnoDataAware.attachEditControl(this, "username", txtUsername, null, true)); + dataAware.add(UnoDataAware.attachEditControl(this, "password", txtPassword, null, true)); + } + + /** + * Shows the dialog. + * If the user clicks ok, changes the given CGPublish properties to the + * user input. + * @param parent a dialog to center this dialog to. + * @return 0 for cancel, 1 for ok. + * @throws Exception - well, if something goes wrong... + */ + public short execute(UnoDialog parent) throws Exception { + host = extractHost(publish.cp_URL); + username = publish.cp_Username == null ? "" : publish.cp_Username; + password = publish.password == null ? "" : publish.password; + dir = extractDir(publish.cp_URL); + setLabel(STATUS_UNKONWN); + + enableTestButton(); + updateUI(); + short result = executeDialog(parent); + //change the CGPublish properties + if (result == 1) { + publish.cp_URL = "ftp://" + host() + getDir(); + publish.cp_Username = username; + publish.password = password; + } + + return result; + } + + /** + * updates the hostname, username, password and + * directory text fields. + * is called uppon initialization. + */ + private void updateUI() { + DataAware.updateUI(dataAware); + setDir(dir); + } + + /** + * extract the hostname out of the url used by the + * publisher. This url does not include the username:password string. + * @param ftpUrl + * @return + */ + private String extractHost(String ftpUrl) { + if (ftpUrl == null || ftpUrl.length() < 6) + return ""; + + String url = ftpUrl.substring(6); + int i = url.indexOf("/"); + if (i == -1) + return url; + else + return url.substring(0, i); + } + + /** + * used to get data from the CGPublish object. + * @param ftpUrl + * @return the directory portion of the ftp-url + */ + private String extractDir(String ftpUrl) { + if (ftpUrl == null || ftpUrl.length() < 6) + return "/"; + + String url = ftpUrl.substring(6); + int i = url.indexOf("/"); + if (i == -1) + return "/"; + else + return url.substring(i); + } + + /** + * enables/disables the "test" button + * according to the status of the hostname, username, password text fields. + * If one of these fields is empty, the button is disabled. + */ + private void enableTestButton() { + setEnabled(btnTestConnection, !(isEmpty(host) || isEmpty(username) || isEmpty(password))); + + } + /** + * @param s + * @return true if the string is null or "". + */ + private final boolean isEmpty(String s) { + return (s==null) || (s.equals("")); + } + + /** + * @return the ftp url with username and password, + * but without the directory portion. + */ + public String getAcountUrl() { + return "ftp://" + username + ":" + password + "@" + host(); + } + + /** + * return the host name without the "ftp://" + * @return + */ + private String host() { + return host(host); + } + + private static String host(String s) { + return (s.startsWith("ftp://") ? s.substring(6) : s); + } + + /** + * @return the full ftp url including username, password and directory portion. + */ + private String getFullUrl() { + return getAcountUrl() + dir; + } + + public void connect() { + new Thread() { + public void run() { + connect1(); + } + }.start(); + } + + /** + * First I try to connect to the full url, including directory. + * If an InteractiveAugmentedIOException accures, I try again, + * this time without the dir spec. If this works, I change the dir + * to "/", if not I say to the user its his problem... + * + */ + private void connect1() { + setEnabled(btnTestConnection, false); + setLabel(STATUS_CONNECTING); + boolean success = false; + try { + connect(getFullUrl()); + success = true; + } catch (InteractiveAugmentedIOException iaioex) { + try { + connect(getAcountUrl()); + setDir("/"); + success = true; + } catch (Exception ex) { + setLabel(STATUS_NO_RIGHTS); + } + } catch (InteractiveNetworkResolveNameException inrne) { + setLabel(STATUS_SERVER_NOT_FOUND); + } catch (AuthenticationRequest ar) { + setLabel(STATUS_USER_PWD_WRONG); + } catch (InteractiveNetworkConnectException incx) { + setLabel(STATUS_HOST_UNREACHABLE); + } catch (Exception ex) { + setLabel(-1); + ex.printStackTrace(); + } + + + if (success) { + setLabel(STATUS_OK); + setEnabled(btnDir, true); + setEnabled(btnOK, true); + } + + setEnabled(btnTestConnection, true); + + } + + /** + * To try the conenction I do some actions that + * seem logical to me: <br/> + * I get a ucb content. + * I list the files in this content. + * I call the ucb "open" command. + * I get the "Title" property of this content. + * @param acountUrl + * @throws Exception + */ + private void connect(String acountUrl) throws Exception { + Object content = ucb.getContent(acountUrl); + + //list files in the content. + List l = ucb.listFiles(acountUrl, null); + + //open the content + OpenCommandArgument2 aArg = new OpenCommandArgument2(); + aArg.Mode = OpenMode.FOLDERS; // FOLDER, DOCUMENTS -> simple filter + aArg.Priority = 32768; // Ignored by most implementations + + ucb.executeCommand(content, "open", aArg); + + //get the title property of the content. + Object obj = ucb.getContentProperty(content, "Title", String.class); + + } + + /** + * changes the ftp subdirectory, in both + * the UI and the data. + * @param s the directory. + */ + public void setDir(String s) { + dir = s; + Helper.setUnoPropertyValue(getModel(txtDir), "Text", dir); + } + + /** + * @return the ftp subdirecrtory. + */ + public String getDir() { + return dir; + } + + /** + * changes the status label to disconnected status, and + * disables the ok and choose-dir buttons. + * This method is called also when the hostname, username + * and passwordtext fields change. + */ + public void disconnect() { + enableTestButton(); + setEnabled(btnOK, false); + setEnabled(btnDir, false); + setLabel(STATUS_UNKONWN); + } + + /** + * used for debuging. + * @param args + */ + public static void main(String args[]) { + String ConnectStr = "uno:socket,host=localhost,port=8100;urp,negotiate=0,forcesynchronous=1;StarOffice.NamingService"; //localhost ;Lo-1.Germany.sun.com; 10.16.65.155 + try { + XMultiServiceFactory xLocMSF = Desktop.connect(ConnectStr); + CGPublish p = new CGPublish(); + p.cp_URL = "ftp://tv-1/Folder"; + p.cp_Username = "ronftp"; + p.password = "ronftp"; + + FTPDialog dialog = new FTPDialog(xLocMSF, p); + dialog.execute(null); + } catch (Exception exception) { + exception.printStackTrace(); + } + } + + /** + * changes the status label and icon, according to the + * given status + * @param status one opf the private status-constants. + * if this param is not one of them, an "unknown error" status is displayed. + */ + private void setLabel(int status) { + switch (status) { + //not connected yet + case STATUS_UNKONWN: + setLabel(resources.resFTPDisconnected, ICON_UNKNOWN); + break; + //connected! + case STATUS_OK : + setLabel(resources.resFTPConnected, ICON_OK); + break; + case STATUS_USER_PWD_WRONG : + setLabel(resources.resFTPUserPwdWrong, ICON_ERROR); + break; + //problem resolving server name + case STATUS_SERVER_NOT_FOUND : + setLabel(resources.resFTPServerNotFound, ICON_ERROR); + break; + //rights problem + case STATUS_NO_RIGHTS : + setLabel(resources.resFTPRights, ICON_ERROR); + break; + //host unreachable (firewall?) + case STATUS_HOST_UNREACHABLE : + setLabel(resources.resFTPHostUnreachable, ICON_ERROR); + break; + case STATUS_CONNECTING: + setLabel(resources.resConnecting, ICON_CONNECTING); + break; + default : + setLabel(resources.resFTPUnknownError, ICON_ERROR); + } + } + + /** + * changes the text of the status label and + * (TODO) the status image. + * @param label + * @param color + */ + private void setLabel(String label, String image) { + Helper.setUnoPropertyValue(getModel(lblStatus), "Label", label); + Helper.setUnoPropertyValue(getModel(imgStatus), "ImageURL", imageUrl(image)); + } + + + private String imageUrl(String s) { + String t = imagesDirectory + s; + //System.out.println(t); + return t; + + } + + /** + * called when the user clicks + * the choose-dir button. ("...") + * Opens the pickFolder dialog. + * checks if the returned folder is an ftp folder. + * sets the textbox and the data to the new selected dir. + */ + public void chooseDirectory() { + SystemDialog sd = SystemDialog.createOfficeFolderDialog(xMSF); + String newUrl = sd.callFolderDialog(resources.resFTPDirectory, "", getFullUrl()); + if (newUrl != null) { + /* if the user chose a local directory, + * sI do not accept it. + */ + if (newUrl.startsWith("ftp://")) + setDir(extractDir(newUrl)); + else + AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(),resources.resIllegalFolder, ErrorHandler.ERROR_PROCESS_FATAL); + } + } + /** + * practical to have such a method... + * @param p the publisher obejct that contains the ftp connection info. + * @return the full ftp url with username password and everything one needs. + */ + public static final String getFullURL(CGPublish p) { + return "ftp://" + p.cp_Username + ":" + p.password + "@" + host(p.cp_URL); + } +}
\ No newline at end of file |