/* * File : AppletHtmlCreator.java * Created : 13-aug-2004 16:35 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2005 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic; import edu.xtec.jclic.fileSystem.FileSystem; import edu.xtec.jclic.misc.Utils; import edu.xtec.jclic.project.JClicProject; import edu.xtec.util.BrowserLauncher; import edu.xtec.util.Messages; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.awt.Color; import java.awt.Component; import java.awt.event.ActionListener; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.09 */ public class AppletHtmlCreator extends javax.swing.JPanel implements ActionListener{ Options options; AuthorSettings settings; static String appletCode = "<!doctype html public \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n" + "<html>\n" + "<head>\n" + "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=%ENCODING\">\n" + "<title>%TITLE</title>\n" + "<script language=\"JavaScript\" src=\"%JAR_BASE/jclicplugin.js\" type=\"text/javascript\"></script>\n" + "</head>\n" + "<body %BODYPARAMS>\n" + "%PRE_APPLET\n" + "<script language=\"JavaScript\">\n" + "setJarBase('%JAR_BASE');%OTHER\n" + "writePlugin('%PROJECT', '%WIDTH', '%HEIGHT');\n" + "</script>\n" + "%POST_APPLET\n" + "</body>\n" + "</html>"; /** Creates new form AppletHtmlCreator */ public AppletHtmlCreator(Options options, AuthorSettings settings) { this.options=options; this.settings=settings; initComponents(); fullPageOption.addActionListener(this); mixedContentOption.addActionListener(this); checkEnabled(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() {//GEN-BEGIN:initComponents javax.swing.JLabel colorLb; javax.swing.JLabel exitUrlLb; java.awt.GridBagConstraints gridBagConstraints; javax.swing.JLabel heightLb; javax.swing.JScrollPane postTextScroll; javax.swing.JLabel postTxtLb; javax.swing.JScrollPane prevTextScroll; javax.swing.JLabel prevTxtLb; javax.swing.JLabel titleLb; javax.swing.JLabel widthLb; bg = new javax.swing.ButtonGroup(); titleLb = new javax.swing.JLabel(); titleTxt = new javax.swing.JTextField(); exitUrlLb = new javax.swing.JLabel(); exitUrlTxt = new javax.swing.JTextField(); fullPageOption = new javax.swing.JRadioButton(); mixedContentOption = new javax.swing.JRadioButton(); sizePanel = new javax.swing.JPanel(); colorLb = new javax.swing.JLabel(); colorButton = new edu.xtec.jclic.beans.ColorButton(); colorButton.setOptions(options); prevTxtLb = new javax.swing.JLabel(); prevTextScroll = new javax.swing.JScrollPane(); prevTextEdit = new javax.swing.JTextArea(); widthLb = new javax.swing.JLabel(); widthText = new javax.swing.JTextField(); heightLb = new javax.swing.JLabel(); heightText = new javax.swing.JTextField(); centeredChk = new javax.swing.JCheckBox(); postTxtLb = new javax.swing.JLabel(); postTextScroll = new javax.swing.JScrollPane(); postTextEdit = new javax.swing.JTextArea(); setLayout(new java.awt.GridBagLayout()); titleLb.setLabelFor(titleTxt); titleLb.setText(options.getMsg("applet_page_title")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(titleLb, gridBagConstraints); titleTxt.setToolTipText(options.getMsg("applet_page_title_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(titleTxt, gridBagConstraints); exitUrlLb.setLabelFor(exitUrlTxt); exitUrlLb.setText(options.getMsg("applet_exitUrl")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(exitUrlLb, gridBagConstraints); exitUrlTxt.setToolTipText(options.getMsg("applet_exitUrl_tooltip")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(exitUrlTxt, gridBagConstraints); fullPageOption.setSelected(true); fullPageOption.setText(options.getMsg("applet_page_full")); bg.add(fullPageOption); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(fullPageOption, gridBagConstraints); mixedContentOption.setText(options.getMsg("applet_page_mixed")); bg.add(mixedContentOption); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); add(mixedContentOption, gridBagConstraints); sizePanel.setLayout(new java.awt.GridBagLayout()); sizePanel.setBorder(new javax.swing.border.TitledBorder(options.getMsg("applet_size"))); sizePanel.setToolTipText(options.getMsg("applet_size_tooltip")); colorLb.setLabelFor(colorButton); colorLb.setText(options.getMsg("applet_bgcolor")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(colorLb, gridBagConstraints); colorButton.setToolTipText(options.getMsg("applet_bgcolor_tooltip")); colorButton.setColor(settings.appletBgColor); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(colorButton, gridBagConstraints); prevTxtLb.setLabelFor(prevTextEdit); prevTxtLb.setText(options.getMsg("applet_prev_text")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(prevTxtLb, gridBagConstraints); prevTextScroll.setPreferredSize(new java.awt.Dimension(200, 60)); prevTextScroll.setMinimumSize(new java.awt.Dimension(200, 60)); prevTextEdit.setWrapStyleWord(true); prevTextEdit.setToolTipText(options.getMsg("applet_prev_text_tooltip")); prevTextEdit.setLineWrap(true); prevTextScroll.setViewportView(prevTextEdit); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weighty = 0.5; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(prevTextScroll, gridBagConstraints); widthLb.setLabelFor(widthText); widthLb.setText(options.getMsg("WIDTH")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(widthLb, gridBagConstraints); widthText.setToolTipText(options.getMsg("applet_width_tooltip")); widthText.setText(settings.appletWidth); widthText.setHorizontalAlignment(javax.swing.JTextField.RIGHT); widthText.setPreferredSize(new java.awt.Dimension(50, 20)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(widthText, gridBagConstraints); heightLb.setLabelFor(heightText); heightLb.setText(options.getMsg("HEIGHT")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(heightLb, gridBagConstraints); heightText.setToolTipText(options.getMsg("applet_height_tooltip")); heightText.setText(settings.appletHeight); heightText.setHorizontalAlignment(javax.swing.JTextField.RIGHT); heightText.setPreferredSize(new java.awt.Dimension(50, 20)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(heightText, gridBagConstraints); centeredChk.setToolTipText(options.getMsg("applet_centered_tooltip")); centeredChk.setSelected(true); centeredChk.setText(options.getMsg("applet_centered")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(centeredChk, gridBagConstraints); postTxtLb.setLabelFor(postTextEdit); postTxtLb.setText(options.getMsg("applet_post_text")); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHEAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(postTxtLb, gridBagConstraints); postTextScroll.setPreferredSize(new java.awt.Dimension(200, 60)); postTextScroll.setMinimumSize(new java.awt.Dimension(200, 60)); postTextEdit.setWrapStyleWord(true); postTextEdit.setToolTipText(options.getMsg("applet_post_text_tooltip")); postTextEdit.setLineWrap(true); postTextScroll.setViewportView(postTextEdit); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weighty = 0.5; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); sizePanel.add(postTextScroll, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(1, 2, 2, 2); add(sizePanel, gridBagConstraints); }//GEN-END:initComponents public void setValues(JClicProject prj){ titleTxt.setText(prj.settings.title); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup bg; private javax.swing.JCheckBox centeredChk; private edu.xtec.jclic.beans.ColorButton colorButton; private javax.swing.JTextField exitUrlTxt; private javax.swing.JRadioButton fullPageOption; private javax.swing.JTextField heightText; private javax.swing.JRadioButton mixedContentOption; private javax.swing.JTextArea postTextEdit; private javax.swing.JTextArea prevTextEdit; private javax.swing.JPanel sizePanel; private javax.swing.JTextField titleTxt; private javax.swing.JTextField widthText; // End of variables declaration//GEN-END:variables private static AppletHtmlCreator panel; public static void createHtml(JClicProject prj, AuthorSettings settings, Component parent){ Options options=prj.getBridge().getOptions(); Messages msg=options.getMessages(); if(panel==null) panel=new AppletHtmlCreator(options, settings); String prjFile=FileSystem.getFileNameOf(prj.getFullPath()); panel.setValues(prj); if(msg.showInputDlg(parent, panel, "applet_create_title")){ boolean full=panel.fullPageOption.isSelected(); String title=panel.titleTxt.getText(); String width=panel.widthText.getText(); String height=panel.heightText.getText(); String preApplet=panel.prevTextEdit.getText(); String postApplet=panel.postTextEdit.getText(); Color bgColor=panel.colorButton.getColor(); boolean centered=panel.centeredChk.isSelected(); StringBuilder optionalParams=new StringBuilder(); String ps=StrUtils.nullableString(panel.exitUrlTxt.getText()); if(ps!=null) optionalParams.append("\r\nsetExitUrl('").append(ps).append("');"); int[] filters={Utils.ALL_HTML_FF}; FileSystem fs=prj.getFileSystem(); String path="index.htm"; String fileName=fs.chooseFile(path, true, filters, options, null, parent, false); if(fileName!=null){ try{ File file=new File(prj.getFileSystem().getFullFileNamePath(fileName)); FileOutputStream fos=prj.getFileSystem().createSecureFileOutputStream(fileName); OutputStreamWriter osw=new OutputStreamWriter(fos, "UTF-8"); PrintWriter pw=new PrintWriter(osw); //String s=ResourceManager.getResourceText("html/applet.html", true); String s=StrUtils.replace(appletCode, "%ENCODING", /*osw.getEncoding()*/ "UTF-8"); s=StrUtils.replace(s, "%JAR_BASE", settings.appletCodeBase); s=StrUtils.replace(s, "%TITLE", title); StringBuilder sb=new StringBuilder(); if(full) sb.append("leftmargin=\"0\" topmargin=\"0\" marginwidth=\"0\" marginheight=\"0\" onLoad=\"window.focus();\""); else{ sb.append("bgcolor=#"); sb.append(Integer.toHexString(bgColor.getRed())); sb.append(Integer.toHexString(bgColor.getGreen())); sb.append(Integer.toHexString(bgColor.getBlue())); } s=StrUtils.replace(s, "%BODYPARAMS", sb.substring(0)); sb.setLength(0); if(!full){ if(centered) sb.append("<div align=\"center\">"); if(preApplet.length()>0) sb.append(preApplet).append("<br>"); } s=StrUtils.replace(s, "%PRE_APPLET", sb.substring(0)); s=StrUtils.replace(s, "%OTHER", optionalParams.substring(0)); s=StrUtils.replace(s, "%WIDTH", full ? "100%" : width); s=StrUtils.replace(s, "%HEIGHT", full ? "100%" : height); s=StrUtils.replace(s, "%PROJECT", prjFile); sb.setLength(0); if(!full){ if(postApplet.length()>0) sb.append("<br>").append(postApplet); if(centered) sb.append("</div>"); } // s=StrUtils.replace(s, "%POST_APPLET", postApplet); s=StrUtils.replace(s, "%POST_APPLET", sb.substring(0)); pw.print(s); pw.flush(); pw.close(); String prompt=StrUtils.replace(msg.get("applet_created_info"), "%s", fileName); if(msg.showQuestionDlgObj(parent, prompt+"\n"+msg.get("applet_created_prompt"), null, "yn")==Messages.YES){ BrowserLauncher.openURL(prj.getFileSystem().getUrl(fileName)); } } catch(Exception ex){ options.getMessages().showErrorWarning(parent, "ERROR", ex); } } } } public void actionPerformed(java.awt.event.ActionEvent actionEvent) { checkEnabled(); } public final void checkEnabled(){ boolean b=mixedContentOption.isSelected(); colorButton.setEnabled(b); widthText.setEnabled(b); heightText.setEnabled(b); centeredChk.setEnabled(b); prevTextEdit.setEnabled(b); postTextEdit.setEnabled(b); } }