001 // This file is part of AceWiki.
002 // Copyright 2008-2012, AceWiki developers.
003 //
004 // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
005 // Lesser General Public License as published by the Free Software Foundation, either version 3 of
006 // the License, or (at your option) any later version.
007 //
008 // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
009 // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
010 // Lesser General Public License for more details.
011 //
012 // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
013 // not, see http://www.gnu.org/licenses/.
014
015 package ch.uzh.ifi.attempto.echocomp;
016
017 import java.io.IOException;
018
019 import nextapp.echo.app.Alignment;
020 import nextapp.echo.app.Column;
021 import nextapp.echo.app.Extent;
022 import nextapp.echo.app.Font;
023 import nextapp.echo.app.Grid;
024 import nextapp.echo.app.Insets;
025 import nextapp.echo.app.Row;
026 import nextapp.echo.app.WindowPane;
027 import nextapp.echo.app.event.ActionEvent;
028 import nextapp.echo.app.event.ActionListener;
029 import nextapp.echo.app.event.WindowPaneEvent;
030 import nextapp.echo.app.event.WindowPaneListener;
031 import nextapp.echo.app.layout.GridLayoutData;
032 import nextapp.echo.filetransfer.app.UploadSelect;
033 import nextapp.echo.filetransfer.app.event.UploadEvent;
034 import nextapp.echo.filetransfer.app.event.UploadListener;
035 import nextapp.echo.filetransfer.model.Upload;
036
037 /**
038 * This is an upload window that allows the user to choose a local file to be uploaded to the server.
039 *
040 * @author Tobias Kuhn
041 */
042 public class UploadWindow extends WindowPane implements ActionListener, UploadListener {
043
044 private static final long serialVersionUID = -8594954833738936914L;
045
046 private ActionListener actionListener;
047 private String fileContent;
048 private Label fileLabel;
049 private GeneralButton openButton;
050 private long maxFileSize = 0;
051 private String actionCommand = "Upload";
052
053 /**
054 * Creates a new upload window.
055 *
056 * @param title The window title.
057 * @param message The message that is displayed above the upload button.
058 * @param parent The parent window.
059 * @param actionListener An action-listener or null.
060 */
061 public UploadWindow(String title, String message, WindowPane parent, ActionListener actionListener) {
062 this.actionListener = actionListener;
063 setTitle(title);
064 setTitleFont(new Font(Style.fontTypeface, Font.ITALIC, new Extent(13)));
065 setModal(true);
066 setWidth(new Extent(420));
067 setHeight(new Extent(200));
068 setResizable(false);
069 setMovable(true);
070 setTitleBackground(Style.windowTitleBackground);
071 setStyleName("Default");
072
073 addWindowPaneListener(new WindowPaneListener() {
074
075 private static final long serialVersionUID = -3897741327122083261L;
076
077 public void windowPaneClosing(WindowPaneEvent e) {
078 actionPerformed(new ActionEvent(UploadWindow.this, "Close"));
079 }
080
081 });
082
083 Grid grid = new Grid(1);
084 grid.setInsets(new Insets(10, 10, 10, 0));
085 grid.setColumnWidth(0, new Extent(400));
086 grid.setRowHeight(0, new Extent(110));
087
088 Column messageColumn = new Column();
089 GridLayoutData layout1 = new GridLayoutData();
090 layout1.setAlignment(new Alignment(Alignment.LEFT, Alignment.TOP));
091 messageColumn.setLayoutData(layout1);
092
093 for (String l : message.split("\\n")) {
094 Label label = new Label(l);
095 label.setFont(new Font(Style.fontTypeface, Font.ITALIC, new Extent(13)));
096 messageColumn.add(label);
097 }
098
099 UploadSelect uploadSelect = new UploadSelect();
100 uploadSelect.addUploadListener(this);
101 //uploadSelect.setSendButtonDisplayed(false);
102 //uploadSelect.setHeight(new Extent(40));
103 //uploadSelect.setWidth(new Extent(300));
104 messageColumn.add(uploadSelect);
105
106 fileLabel = new Label();
107 messageColumn.add(fileLabel);
108
109 grid.add(messageColumn);
110
111 Row buttonBar = new Row();
112 buttonBar.setCellSpacing(new Extent(10));
113 buttonBar.setInsets(new Insets(0, 0, 0, 10));
114 openButton = new GeneralButton("Open", 80, this);
115 openButton.setEnabled(false);
116 buttonBar.add(openButton);
117 buttonBar.add(new GeneralButton("Cancel", 80, this));
118 GridLayoutData layout2 = new GridLayoutData();
119 layout2.setAlignment(new Alignment(Alignment.CENTER, Alignment.BOTTOM));
120 buttonBar.setLayoutData(layout2);
121 grid.add(buttonBar);
122
123 add(grid);
124
125 if (parent != null) {
126 setPositionX(new Extent(parent.getPositionX().getValue() + (parent.getWidth().getValue() - getWidth().getValue())/2));
127 setPositionY(new Extent(parent.getPositionY().getValue() + (parent.getHeight().getValue() - getHeight().getValue())/2));
128 }
129 }
130
131 /**
132 * Sets the maximum file size.
133 *
134 * @param maxFileSize The maximum file size in bytes. 0 for unlimited size.
135 */
136 public void setMaxFileSize(long maxFileSize) {
137 this.maxFileSize = maxFileSize;
138 }
139
140 /**
141 * Sets the action command for the upload event.
142 *
143 * @param actionCommand The action command.
144 */
145 public void setActionCommand(String actionCommand) {
146 this.actionCommand = actionCommand;
147 }
148
149 /**
150 * Returns the content of the uploaded file as a string.
151 *
152 * @return The content of the uploaded file.
153 */
154 public String getFileContent() {
155 return fileContent;
156 }
157
158 public void actionPerformed(ActionEvent e) {
159 setVisible(false);
160 if (actionListener == null) return;
161 if (e.getActionCommand().equals("Open")) {
162 actionListener.actionPerformed(new ActionEvent(this, actionCommand));
163 }
164 }
165
166 public void uploadComplete(UploadEvent e) {
167 Upload upload = e.getUpload();
168 if (maxFileSize > 0 && upload.getSize() > maxFileSize) {
169 fileContent = null;
170 fileLabel.setText("The chosen file is too large (" + upload.getSize() + " Bytes).");
171 openButton.setEnabled(false);
172 return;
173 }
174 try {
175 byte[] b = new byte[(int) upload.getSize()];
176 upload.getInputStream().read(b, 0, (int) upload.getSize());
177 fileContent = new String(b);
178 String fileName = upload.getFileName();
179 if (fileName.length() > 15) fileName = fileName.substring(0, 15) + "...";
180 fileLabel.setText("Chosen file: " + fileName + " (" + upload.getSize() + " Bytes)");
181 openButton.setEnabled(true);
182 } catch (IOException ioe) {
183 ioe.printStackTrace();
184 }
185 }
186
187 }