summaryrefslogtreecommitdiff
path: root/wizards/com/sun/star/wizards/web/WWD_Startup.java
diff options
context:
space:
mode:
Diffstat (limited to 'wizards/com/sun/star/wizards/web/WWD_Startup.java')
-rw-r--r--wizards/com/sun/star/wizards/web/WWD_Startup.java984
1 files changed, 984 insertions, 0 deletions
diff --git a/wizards/com/sun/star/wizards/web/WWD_Startup.java b/wizards/com/sun/star/wizards/web/WWD_Startup.java
new file mode 100644
index 000000000000..200f70a32383
--- /dev/null
+++ b/wizards/com/sun/star/wizards/web/WWD_Startup.java
@@ -0,0 +1,984 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+package com.sun.star.wizards.web;
+
+//import com.sun.star.awt.ItemEvent;
+//import com.sun.star.awt.XItemListener;
+import java.io.FileNotFoundException;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Vector;
+
+import com.sun.star.awt.VclWindowPeerAttribute;
+import com.sun.star.awt.XControl;
+import com.sun.star.awt.XItemListener;
+import com.sun.star.awt.XWindow;
+import com.sun.star.awt.XWindowPeer;
+import com.sun.star.frame.XDesktop;
+import com.sun.star.frame.XFrame;
+import com.sun.star.frame.XModel;
+import com.sun.star.lang.EventObject;
+import com.sun.star.lang.XMultiServiceFactory;
+import com.sun.star.uno.UnoRuntime;
+import com.sun.star.wizards.common.ConfigSet;
+import com.sun.star.wizards.common.Configuration;
+import com.sun.star.wizards.common.Desktop;
+import com.sun.star.wizards.common.FileAccess;
+import com.sun.star.wizards.common.Helper;
+import com.sun.star.wizards.common.JavaTools;
+import com.sun.star.wizards.common.SystemDialog;
+import com.sun.star.wizards.document.OfficeDocument;
+import com.sun.star.wizards.ui.DocumentPreview;
+import com.sun.star.wizards.ui.event.DataAware;
+import com.sun.star.wizards.ui.event.ListModelBinder;
+import com.sun.star.wizards.ui.event.RadioDataAware;
+import com.sun.star.wizards.ui.event.SimpleDataAware;
+import com.sun.star.wizards.ui.event.Task;
+import com.sun.star.wizards.ui.event.UnoDataAware;
+import com.sun.star.wizards.web.data.CGContent;
+import com.sun.star.wizards.web.data.CGDocument;
+import com.sun.star.wizards.web.data.CGIconSet;
+import com.sun.star.wizards.web.data.CGPublish;
+import com.sun.star.wizards.web.data.CGSession;
+import com.sun.star.wizards.web.data.CGSessionName;
+import com.sun.star.wizards.web.data.CGSettings;
+import com.sun.star.wizards.web.data.CGStyle;
+
+/**
+ * Web Wizard Dialog implementation : Startup.
+ * This class contains the startup implementation and session mounting methods.<p/>
+ * <h2> Data Aware Concept </h2>
+ * <p> I use DataAware objects, which synchronize
+ * UI and Data. A DataAware object a kind of interface
+ * between a Value and a UI element.
+ * </P>
+ * <p>
+ * A Value is either a JavaBean property with
+ * a Getter and a Setter or a public class Memeber.
+ * </P>
+ * When the UI Control changes, the Value changes correspondingly.
+ * This depends on settings a Listener which calls the updateData()
+ * method od the DataAware object.
+ * When the Value changes, the UI Control changes respopndingly.
+ * This also depends on settings a Listener which calls the updateUI()
+ * method of the DataAware object.
+ * </P>
+ * <P>
+ * here I use only UI Listeners, and keep calling
+ * the updateUI() method whenever I change the Value.
+ * </P>
+ * To contain the Data, I use the Configuration Data Objects
+ * which read themselfs out of the Configuration. they are all located under
+ * the data package.
+ * <p/>
+ * Different groups of DataAware objects are grouped into vectors.
+ * Each group (all elements of a vector) uses the same DataObject,
+ * so when I change the underlying dataObject, I change the whole vector's DataObject,
+ * thus actualizing UI.<br/>
+ * This is what happends when a session loads: I Load the session into
+ * a tree of DataObjects, and change the DataAware's DataObject. <br/>
+ * One could also look at this as a kind of "View-Model" relationship.
+ * The controls are the View, The DataObjects are the Model, containing the
+ * Data rad directly from the configuration, and the DataAware objects
+ * are the controller inbetween.
+ *
+ * @author rpiterman
+ *
+ */
+public abstract class WWD_Startup extends WWD_General
+{
+
+ SimpleDataAware sda = null;
+ /**
+ * This is currently not used.
+ * It should have been a Listener which invoces
+ * an Update to the Preview-Document, only
+ * We did not implement the live-preview document,
+ * so this became obsolete.
+ */
+ protected DataAware.Listener refresh;
+ /**
+ * Is called whenever a field is changed which
+ * could affect the "create" button enable state,
+ * like publishing-checkboxes, save-session check- and textbox.
+ */
+ protected DataAware.Listener checkPublish = new CheckPublish();
+ /**
+ * The Vector containing DataAware objects
+ * which relay on the selected document
+ * as DataObject (or Model).
+ */
+ protected List docAware = new Vector();
+ /**
+ * The Vector containing DataAware objects
+ * which relay on the session's generalInfo
+ * Object (CGSession.cp_GeneralInfo) as
+ * DataObject (or model).
+ */
+ protected List genAware = new Vector();
+ /**
+ * The vector containing DataAware objectscm25npd ..
+ * which relay on the session's Design Object
+ * (CGSession.cp_Design) as DataObject
+ * (or model).
+ *
+ */
+ protected List designAware = new Vector();
+ /**
+ * A Vector containig the DataAware objects
+ * which relay on Publishing Objects.
+ * Differently from other Vectors, each
+ * DataAware object in this Vector relays
+ * on a <b>different</b> CGPublish object,
+ * So they are handled with more care.
+ */
+ protected List pubAware = new Vector(3);
+ /**
+ * The DataAware object which handles
+ * the documents-list events.
+ * This will call the set/getDocument() method
+ * implemented in WWD_General.
+ */
+ protected UnoDataAware docListDA;
+ /**
+ * DataAware object which synchronizes the session
+ * name in step 7 with the CGSession.cp_Name
+ */
+ protected UnoDataAware sessionNameDA;
+ /**
+ * Binds a ListModel to the UnoControlListBox.
+ */
+ protected ListModelBinder docsBinder;
+ /**
+ * a DocumentPreview object is
+ * the UI OO Document preview
+ * in the Dialog
+ */
+ protected DocumentPreview dpStylePreview;
+ /**
+ * An Object that implements the
+ * File-copy and refresh of the
+ * style preview
+ */
+ protected StylePreview stylePreview;
+ /**
+ * the currently selected document.
+ */
+ protected short[] selectedDoc = new short[0];
+ /**
+ * If ftp proxies are on, ftp is disabled, and
+ * the true/false of the FTP publisher is set to false.
+ * In order to save it correctly when saving the session
+ * at the end, the original loaded value is saved to this variable;
+ */
+ boolean __ftp;
+ /**
+ * When the wizard starts, a new document opens.
+ * The backgroundDoc memeber contains the TextDocument
+ * instance used for that purpose.
+ */
+ protected XFrame myFrame;
+
+
+ /* ******************************************
+ * ****************************************
+ * General Methods
+ * ****************************************
+ * ****************************************** */
+
+ /*
+ * GENERAL Initialization methods
+ */
+ /**
+ * He - my constructor !
+ * I call/do here in this order: <br/>
+ * Check if ftp http proxy is set, and warn user he can not use
+ * ftp if it is.<br/>
+ * draw NaviBar and steps 1 to 7, incl. Step X,
+ * which is the Layouts ImageList on step 3.<br/>
+ * load the settings from the configuration. <br/>
+ * set the default save session name to the first
+ * available one (sessionX or something like that). <br/>
+ * set the Layouts ImageList ListModel, and call
+ * its "create()" method. <br/>
+ * check the content (documents) specified in the default session.<br/>
+ * fill the list boxes (saved sessions, styles, combobox save session). <br/>
+ * make data aware. <br/>
+ * updateUI (refreshes the display to crrespond to the data in
+ * the default session.)<br/>
+ * fill the documents listbox. <br/>
+ * if proxies are set, disable the ftp controls in step 7.
+ */
+ public WWD_Startup(XMultiServiceFactory xmsf) throws Exception
+ {
+ super(xmsf);
+
+ proxies = getOOProxies();
+
+ String soTemplateDir = FileAccess.getOfficePath(xmsf, "Template", "share", "/wizard");
+
+ String exclamationURL = FileAccess.connectURLs(soTemplateDir, "../wizard/bitmap/caution_16.png");
+ this.drawNaviBar();
+ this.buildStep1();
+ this.buildStep2();
+ this.buildStep3();
+
+ this.buildStep4();
+ this.buildStep5();
+ this.buildStep6();
+ this.buildStep7(proxies, exclamationURL);
+ buildStepX();
+
+ this.xMSF = xMSF;
+ XDesktop xDesktop = Desktop.getDesktop(xMSF);
+ myFrame = OfficeDocument.createNewFrame(xMSF, this);
+ Object doc = OfficeDocument.createNewDocument(myFrame, "swriter", false, true);
+
+ loadSettings(doc);
+ setSaveSessionName(settings.cp_DefaultSession);
+
+ ilLayouts.setListModel(settings.cp_Layouts);
+ ilLayouts.create(this);
+
+ checkContent(settings.cp_DefaultSession.cp_Content, new Task("", "", 99999), this.xControl);
+
+ //saved sessions, styles, combobox save session.
+ // also set the chosen saved session...
+ fillLists();
+ makeDataAware();
+ // change the display to correspond to the current session.
+ updateUI();
+ // fill the documents listbox.
+ mount(settings.cp_DefaultSession.cp_Content);
+
+
+ if (proxies)
+ {
+ setEnabled(btnFTP, false);
+ setEnabled(chkFTP, false);
+ }
+ }
+
+ /**
+ * return true if http proxies or other proxies
+ * which do not enable ftp to function correctly are set.
+ * @return true if (http) proxies are on.
+ * @throws Exception
+ */
+ private boolean getOOProxies() throws Exception
+ {
+ Object node = Configuration.getConfigurationRoot(xMSF, "org.openoffice.Inet/Settings", false);
+ int i = Configuration.getInt("ooInetProxyType", node);
+ //System.out.println("WWD:Startup:getOOProxies:" + i);
+ switch (i)
+ {
+ case 0: //no proxies
+ return false;
+ case 2: //http proxies
+ return true;
+ default:
+ return true;
+ }
+ }
+
+ /**
+ * calculates the first available session name,
+ * and sets the current session name to it.
+ * The combobox text in step 7 will be updated
+ * automatically when updateUI() is called.
+ */
+ protected void setSaveSessionName(CGSession session)
+ {
+ int max = 0;
+ int len = resources.resSessionName.length();
+ // traverse between the sessions and find the one that
+ // has the biggest number.
+ for (int i = 0; i < settings.cp_SavedSessions.getSize(); i++)
+ {
+ String sessionName = ((CGSessionName) settings.cp_SavedSessions.getElementAt(i)).cp_Name;
+ if (sessionName.startsWith(resources.resSessionName))
+ {
+ max = max(max, Integer.valueOf(sessionName.substring(len)).intValue());
+ }
+ }
+
+ session.cp_Name = resources.resSessionName + ++max;
+
+ }
+
+ private int max(int i1, int i2)
+ {
+ if (i1 > i2)
+ {
+ return i1;
+ }
+ else
+ {
+ return i2;
+ }
+ }
+
+ /**
+ * fills the road map, and sets the necessary properties,
+ * like MaxStep, Complete, Interactive-
+ * Disables the finbihButton.
+ */
+ private void addRoadMapItems()
+ {
+ insertRoadMapItems(new String[]
+ {
+ resources.resStep1, resources.resStep2, resources.resStep3, resources.resStep4, resources.resStep5, resources.resStep6, resources.resStep7
+ }, new int[]
+ {
+ 1, 2, 3, 4, 5, 6, 7
+ }, new boolean[]
+ {
+ true, true, false, false, false, false, false
+ });
+
+ setRoadmapInteractive(true);
+ setRoadmapComplete(true);
+ setCurrentRoadmapItemID((short) 1);
+ setMaxStep(7);
+ enableFinishButton(false);
+
+ }
+
+ /**
+ * This method goes through all
+ * the DataAware vectors and objects and
+ * calls their updateUI() method.
+ * In response, the UI is synchronized to
+ * the state of the corresponding data objects.
+ *
+ */
+ private void updateUI()
+ {
+ DataAware.updateUI(designAware);
+ DataAware.updateUI(genAware);
+ DataAware.updateUI(pubAware);
+ sessionNameDA.updateUI();
+ checkPublish();
+ }
+
+ private XFrame getFrame(Object model)
+ {
+ XModel xmodel = (XModel) UnoRuntime.queryInterface(XModel.class, model);
+ return xmodel.getCurrentController().getFrame();
+ }
+
+ /**
+ * create the peer, add roadmap,
+ * add roadmap items, add style-preview,
+ * disable the steps 3 to 7 if no documents are
+ * on the list, and... show the dialog!
+ */
+ public void show()
+ {
+ try
+ {
+
+
+ /* myFrame.initialize(docWindow);
+ * */
+
+ //desktopFrame = Desktop.findAFrame(xMSF, myFrame, desktopFrame);
+
+ //XWindow xContainerWindow = myFrame.getContainerWindow();
+
+ XWindow xContainerWindow = myFrame.getComponentWindow();
+ XWindowPeer xWindowPeer = (XWindowPeer) UnoRuntime.queryInterface(XWindowPeer.class, xContainerWindow);
+
+ createWindowPeer(xWindowPeer);
+
+ addRoadmap();
+ addRoadMapItems();
+ addStylePreview();
+ checkSteps();
+
+ executeDialog(myFrame);
+ removeTerminateListener();
+
+ }
+ catch (java.lang.Exception jexception)
+ {
+ jexception.printStackTrace(System.out);
+ }
+ }
+
+ /**
+ * initializes the style preview.
+ */
+ private void addStylePreview()
+ {
+ try
+ {
+ dpStylePreview = new DocumentPreview(xMSF, imgPreview);
+ stylePreview = new StylePreview(xMSF, settings.workPath);
+ stylePreview.refresh(settings.cp_DefaultSession.getStyle(), settings.cp_DefaultSession.cp_Design.cp_BackgroundImage);
+ dpStylePreview.setDocument(stylePreview.htmlFilename, DocumentPreview.PREVIEW_MODE);
+
+ }
+ catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ /**
+ * Loads the web wizard settings from the registry.
+ */
+ private void loadSettings(Object document)
+ {
+ try
+ {
+ // instanciate
+ String[] settingsResources = new String[]
+ {
+ resources.resPages,
+ resources.resSlides,
+ resources.resCreatedTemplate,
+ resources.resUpdatedTemplate,
+ resources.resSizeTemplate
+ };
+
+ settings = new CGSettings(xMSF, settingsResources, document);
+
+ // get configuration view
+ Object confRoot = Configuration.getConfigurationRoot(xMSF, CONFIG_PATH, false);
+ // read
+ settings.readConfiguration(confRoot, CONFIG_READ_PARAM);
+
+ ConfigSet set = settings.cp_DefaultSession.cp_Publishing;
+
+ // now if path variables are used in publisher pathes, they
+ // are getting replaced here...
+ for (int i = 0; i < set.getSize(); i++)
+ {
+ CGPublish p = (CGPublish) set.getElementAt(i);
+ p.cp_URL = substitute(p.cp_URL);
+ }
+
+ // initialize the settings.
+ settings.configure(xMSF);
+
+ // set resource needed for web page.
+
+ // sort the styles alphabetically
+ settings.cp_Styles.sort(new StylesComparator());
+
+ prepareSessionLists();
+
+ if (proxies)
+ {
+ __ftp = getPublisher(FTP_PUBLISHER).cp_Publish;
+ getPublisher(FTP_PUBLISHER).cp_Publish = false;
+
+ }
+
+ }
+ catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ protected void prepareSessionLists()
+ {
+ // now copy the sessions list...
+ Object[] sessions = settings.cp_SavedSessions.items();
+ settings.savedSessions.clear();
+ for (int i = 0; i < sessions.length; i++)
+ {
+ settings.savedSessions.add(i, sessions[i]); // add an empty session to the saved session list which apears in step 1
+ }
+ CGSessionName sn = new CGSessionName();
+ sn.cp_Name = resources.resSessionNameNone;
+ settings.cp_SavedSessions.add(0, sn);
+ }
+
+ /**
+ * fills the saved session list, the styles list,
+ * and save session combo box.
+ * Also set the selected "load" session to the last session
+ * which was saved.
+ */
+ private void fillLists()
+ {
+ // fill the saved session list.
+ ListModelBinder.fillList(lstLoadSettings, settings.cp_SavedSessions.items(), null);
+
+ // set the selected session to load. (step 1)
+ selectSession();
+
+ // fill the styles list.
+ ListModelBinder.fillList(lstStyles, settings.cp_Styles.items(), null);
+
+ // fill the save session combobox (step 7)
+ ListModelBinder.fillComboBox(cbSaveSettings, settings.savedSessions.items(), null);
+
+
+ }
+
+ protected void selectSession()
+ {
+ int selectedSession = 0;
+ if (settings.cp_LastSavedSession != null && !settings.cp_LastSavedSession.equals(""))
+ {
+
+ Object ses = settings.cp_SavedSessions.getElement(settings.cp_LastSavedSession);
+ if (ses != null)
+ {
+ selectedSession = settings.cp_SavedSessions.getIndexOf(ses);
+ }
+ }
+ Helper.setUnoPropertyValue(getModel(lstLoadSettings), "SelectedItems", new short[]
+ {
+ (short) selectedSession
+ });
+
+ }
+
+ public class SimpleDataawareUpdater implements XItemListener
+ {
+ /* (non-Javadoc)
+ * @see com.sun.star.lang.XEventListener#disposing(com.sun.star.lang.EventObject)
+ */
+
+ public void disposing(EventObject arg0)
+ {
+ // TODO Auto-generated method stub
+ }
+
+ public void itemStateChanged(com.sun.star.awt.ItemEvent itemEvent)
+ {
+ sda.updateData();
+ //TODO xf uncomment
+ //refresh.eventPerformed(ie);
+ }
+ }
+
+ /**
+ * attaches to each ui-data-control (like checkbox, groupbox or
+ * textbox, no buttons though), a DataObject's JavaBean Property,
+ * or class member.
+ */
+ private void makeDataAware()
+ {
+ //page 1
+ new ListModelBinder(lstLoadSettings, settings.cp_SavedSessions);
+
+ //page 2 : document properties
+
+ docListDA = (UnoDataAware) UnoDataAware.attachListBox(this, "SelectedDoc", lstDocuments, null, false);
+ docListDA.disableControls(new Object[]
+ {
+ /*btnDocDown, btnDocUp, */
+ lnDocsInfo, btnRemoveDoc, lblDocTitle, txtDocTitle, lblDocInfo, txtDocInfo, lblDocAuthor, txtDocAuthor, lblDocExportFormat, lstDocTargetType
+ });
+ docListDA.updateUI();
+
+ CGDocument doc = new CGDocument(); //dummy
+
+ docsBinder = new ListModelBinder(lstDocuments, settings.cp_DefaultSession.cp_Content.cp_Documents);
+
+ docAware.add(UnoDataAware.attachEditControl(doc, "cp_Title", txtDocTitle, refresh, true));
+ docAware.add(UnoDataAware.attachEditControl(doc, "cp_Description", txtDocInfo, refresh, true));
+ docAware.add(UnoDataAware.attachEditControl(doc, "cp_Author", txtDocAuthor, refresh, true));
+ docAware.add(UnoDataAware.attachListBox(doc, "Exporter", lstDocTargetType, refresh, false));
+
+ //page 3 : Layout
+ Object design = settings.cp_DefaultSession.cp_Design;
+ sda = new SimpleDataAware(design, new DataAware.PropertyValue("Layout", design), ilLayouts, new DataAware.PropertyValue("Selected", ilLayouts));
+ ilLayouts.addItemListener(new SimpleDataawareUpdater());
+ designAware.add(sda);
+
+ //page 4 : layout 2
+ designAware.add(UnoDataAware.attachCheckBox(design, "cp_DisplayDescription", chbDocDesc, refresh, true));
+ designAware.add(UnoDataAware.attachCheckBox(design, "cp_DisplayAuthor", chbDocAuthor, refresh, true));
+ designAware.add(UnoDataAware.attachCheckBox(design, "cp_DisplayCreateDate", chkDocCreated, refresh, true));
+ designAware.add(UnoDataAware.attachCheckBox(design, "cp_DisplayUpdateDate", chkDocChanged, refresh, true));
+ designAware.add(UnoDataAware.attachCheckBox(design, "cp_DisplayFilename", chkDocFilename, refresh, true));
+ designAware.add(UnoDataAware.attachCheckBox(design, "cp_DisplayFileFormat", chkDocFormat, refresh, true));
+ designAware.add(UnoDataAware.attachCheckBox(design, "cp_DisplayFormatIcon", chkDocFormatIcon, refresh, true));
+ designAware.add(UnoDataAware.attachCheckBox(design, "cp_DisplayPages", chkDocPages, refresh, true));
+ designAware.add(UnoDataAware.attachCheckBox(design, "cp_DisplaySize", chkDocSize, refresh, true));
+ designAware.add(RadioDataAware.attachRadioButtons(settings.cp_DefaultSession.cp_Design, "cp_OptimizeDisplaySize", new Object[]
+ {
+ optOptimize640x480, optOptimize800x600, optOptimize1024x768
+ }, refresh, true));
+
+
+ //page 5 : Style
+ /*
+ * note : on style change, i do not call here refresh ,but rather on
+ * a special method which will perform some display, background and Iconsets changes.
+ */
+ designAware.add(UnoDataAware.attachListBox(settings.cp_DefaultSession.cp_Design, "Style", lstStyles, null, false));
+
+ //page 6 : site general props
+ genAware.add(UnoDataAware.attachEditControl(settings.cp_DefaultSession.cp_GeneralInfo, "cp_Title", txtSiteTitle, refresh, true));
+ genAware.add(UnoDataAware.attachEditControl(settings.cp_DefaultSession.cp_GeneralInfo, "cp_Description", txtSiteDesc, refresh, true));
+
+ genAware.add(UnoDataAware.attachDateControl(settings.cp_DefaultSession.cp_GeneralInfo, "CreationDate", dateSiteCreated, refresh, false));
+ genAware.add(UnoDataAware.attachDateControl(settings.cp_DefaultSession.cp_GeneralInfo, "UpdateDate", dateSiteUpdate, refresh, false));
+ genAware.add(UnoDataAware.attachEditControl(settings.cp_DefaultSession.cp_GeneralInfo, "cp_Email", txtEmail, refresh, true));
+ genAware.add(UnoDataAware.attachEditControl(settings.cp_DefaultSession.cp_GeneralInfo, "cp_Copyright", txtCopyright, refresh, true));
+
+ //page 7 : publishing
+
+ pubAware(LOCAL_PUBLISHER, chkLocalDir, txtLocalDir, false);
+ pubAware(FTP_PUBLISHER, chkFTP, lblFTP, true);
+ pubAware(ZIP_PUBLISHER, chkZip, txtZip, false);
+
+ sessionNameDA = UnoDataAware.attachEditControl(settings.cp_DefaultSession, "cp_Name", cbSaveSettings, null, true);
+
+ //cleanup when exiting wizard.
+ //guiEventListener.add("WebWizardDialog",EventNames.EVENT_WINDOW_HIDDEN, "cleanup", this);
+ //xWindow.addWindowListener((XWindowListener)guiEventListener);
+ }
+
+ /**
+ * A help method to attach a Checkbox and a TextBox to
+ * a CGPublish object properties/class members,
+ * @param publish
+ * @param checkbox
+ * @param textbox
+ */
+ private void pubAware(String publish, Object checkbox, Object textbox, boolean isLabel)
+ {
+ Object p = settings.cp_DefaultSession.cp_Publishing.getElement(publish);
+ UnoDataAware uda = UnoDataAware.attachCheckBox(p, "cp_Publish", checkbox, checkPublish, true);
+ uda.setInverse(true);
+
+ uda.disableControls(new Object[]
+ {
+ textbox
+ });
+ pubAware.add(uda);
+ pubAware.add(
+ isLabel ? UnoDataAware.attachLabel(p, "URL", textbox, checkPublish, false)
+ : UnoDataAware.attachEditControl(p, "URL", textbox, checkPublish, false));
+
+ }
+
+ /*
+ * Session load methods
+ * (are used both on the start of the wizard and
+ * when the user loads a session)
+ */
+ /**
+ * Is called when a new session/settings is
+ * loaded. <br/>
+ * Checks the documents (validate), fills the
+ * documents listbox, and changes the
+ * DataAware data objects to the
+ * new session's objects.<br/>
+ * Task advances 4 times in the mount method,
+ * and ??? times for each document in the session.
+ *
+ */
+ protected void mount(CGSession session, Task task, boolean refreshStyle, XControl xC)
+ {
+ /* This checks the documents. If the user
+ * chooses to cancel, the session is not loaded.
+ */
+ checkContent(session.cp_Content, task, xC);
+
+ settings.cp_DefaultSession = session;
+
+ mount(session.cp_Content);
+
+ task.advance(true);
+
+ mount(session.cp_Design, designAware);
+ mount(session.cp_GeneralInfo, genAware);
+
+ task.advance(true);
+
+ mount(session.cp_Publishing.getElement(LOCAL_PUBLISHER), 0);
+ mount(session.cp_Publishing.getElement(FTP_PUBLISHER), 1);
+ mount(session.cp_Publishing.getElement(ZIP_PUBLISHER), 2);
+
+ task.advance(true);
+
+ sessionNameDA.setDataObject(session, true);
+ Helper.setUnoPropertyValue(getModel(chkSaveSettings), "State", new Short((short) 1));
+ docListDA.updateUI();
+
+ task.advance(true);
+
+ if (refreshStyle)
+ {
+ refreshStylePreview();
+ updateIconsetText();
+ }
+
+ //updateUI();
+ }
+
+ /**
+ * used to mount the publishing objects. This is somehow cryptic -
+ * there are 6 DataAware objects, 2 for each Publishing Object (CGPublish).
+ * All 6 reside on one Vector (pubAware).
+ * Since, otherwise than other DataAware objects, different
+ * Objects on the same Vector need different DataObjectBinding,
+ * I use this method...
+ * @param data the CGPublish object
+ * @param i the number of the object (0 = local, 1 = ftp, 2 = zip)
+ */
+ private void mount(Object data, int i)
+ {
+ ((DataAware) pubAware.get(i * 2)).setDataObject(data, true);
+ ((DataAware) pubAware.get(i * 2 + 1)).setDataObject(data, true);
+ }
+
+ /**
+ * Fills the documents listbox.
+ * @param root the CGContent object
+ * that contains the documents (a ListModel)
+ */
+ private void mount(CGContent root)
+ {
+ ListModelBinder.fillList(lstDocuments, root.cp_Documents.items(), null);
+ docsBinder.setListModel(root.cp_Documents);
+ disableDocUpDown();
+
+ }
+
+ /**
+ * changes the DataAwares Objects' (in
+ * the gioen list) DataObject to the
+ * @param data
+ * @param list
+ */
+ protected void mount(Object data, List list)
+ {
+ for (int i = 0; i < list.size(); i++)
+ {
+ ((DataAware) list.get(i)).setDataObject(data, true);
+ }
+ }
+
+ /**
+ * Checks if the document specified by the given CGDocument
+ * object (cp_URL) exists. Calls also the validate(...) method
+ * of this document.
+ * If the document does not exist, it asks the user whether
+ * to specify a new URL, or forget about this document.
+ * @param doc the document to check.
+ * @param task while loading a session, a status is
+ * displayed, using the Task object to monitor progress.
+ * @return true if the document is ok (a file exists in the given url).
+ */
+ protected boolean checkDocument(CGDocument doc, Task task, XControl xC)
+ {
+ try
+ {
+ doc.validate(xMSF, task);
+ return true;
+ }
+ catch (FileNotFoundException ex)
+ {
+
+ int relocate = SystemDialog.showMessageBox(xMSF, xC.getPeer(), "WarningBox", VclWindowPeerAttribute.YES_NO + VclWindowPeerAttribute.DEF_NO, getFileAccess().getPath(doc.cp_URL, "") + "\n\n" + resources.resSpecifyNewFileLocation);
+
+ if (relocate == 2)
+ {
+ String[] file = getDocAddDialog().callOpenDialog(false, FileAccess.getParentDir(doc.cp_URL));
+ if (file == null)
+ {
+ return false;
+ }
+ else
+ {
+ doc.cp_URL = file[0];
+ return checkDocument(doc, task, xC);
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+ catch (IllegalArgumentException iaex)
+ {
+ //file is a directory
+ AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(),
+ JavaTools.replaceSubString(resources.resErrIsDirectory,
+ getFileAccess().getPath(doc.cp_URL, ""),
+ "%FILENAME"),
+ ErrorHandler.ERROR_PROCESS_FATAL);
+ return false;
+ }
+ catch (Exception exp)
+ {
+ //something went wrong.
+ exp.printStackTrace();
+ AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(),
+ JavaTools.replaceSubString(resources.resErrDocValidate,
+ getFileAccess().getPath(doc.cp_URL, ""),
+ "%FILENAME"), ErrorHandler.ERROR_PROCESS_FATAL);
+ return false;
+ }
+
+ }
+
+ /**
+ * Checks the documents contained in this content.
+ * @param content
+ * @param task
+ */
+ private void checkContent(CGContent content, Task task, XControl xC)
+ {
+ for (int i = 0; i < content.cp_Documents.getSize(); i++)
+ {
+ if (!checkDocument((CGDocument) content.cp_Documents.getElementAt(i), task, xC))
+ // I use here 'i--' since, when the document is removed
+ // an index change accures
+ {
+ content.cp_Documents.remove(i--);
+ /*for (Iterator i = content.cp_Contents.childrenMap.values().iterator(); i.hasNext();)
+ checkContent((CGContent)i.next(),task);*/
+ }
+ }
+ }
+
+ /**
+ * A Listener which is called whenever
+ * a Publish checkbox/textbox state changes, and
+ * changes the "create" button enable state accordingly.
+ * @author rpiterman
+ */
+ private class CheckPublish implements DataAware.Listener
+ {
+
+ public void eventPerformed(Object event)
+ {
+ checkPublish();
+ }
+ }
+
+ /**
+ * Disables/enables the docUpDown buttons (step 2)
+ * according to the currently selected document
+ * (no doc selected - both disbaled, last doc selected,
+ * down disabled and so on...)
+ *
+ */
+ protected void disableDocUpDown()
+ {
+ try
+ {
+ setEnabled(btnDocUp, selectedDoc.length == 0 ? Boolean.FALSE : (selectedDoc[0] == 0 ? Boolean.FALSE : Boolean.TRUE));
+ setEnabled(btnDocDown, selectedDoc.length == 0 ? Boolean.FALSE : (selectedDoc[0] + 1 < settings.cp_DefaultSession.cp_Content.cp_Documents.getSize() ? Boolean.TRUE : Boolean.FALSE));
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ void updateBackgroundText()
+ {
+ String bg = settings.cp_DefaultSession.cp_Design.cp_BackgroundImage;
+ if (bg == null || bg.equals(""))
+ {
+ bg = resources.resBackgroundNone;
+ }
+ else
+ {
+ bg = FileAccess.getPathFilename(getFileAccess().getPath(bg, null));
+ }
+ Helper.setUnoPropertyValue(getModel(txtBackground), "Label", bg);
+ }
+
+ void updateIconsetText()
+ {
+ String iconset = settings.cp_DefaultSession.cp_Design.cp_IconSet;
+ String iconsetName;
+ if (iconset == null || iconset.equals(""))
+ {
+ iconsetName = resources.resIconsetNone;
+ }
+ else
+ {
+ CGIconSet is = (CGIconSet) settings.cp_IconSets.getElement(iconset);
+ if (is == null)
+ {
+ iconsetName = resources.resIconsetNone;
+ }
+ else
+ {
+ iconsetName = is.cp_Name;
+ }
+ }
+
+ Helper.setUnoPropertyValue(getModel(txtIconset), "Label", iconsetName);
+ }
+
+ /**
+ * refreshes the style preview.
+ * I also call here "updateBackgroundtext", because always
+ * when the background is changed, this method
+ * has to be called, so I am walking on the safe side here...
+ */
+ public void refreshStylePreview()
+ {
+ try
+ {
+ updateBackgroundText();
+ stylePreview.refresh(settings.cp_DefaultSession.getStyle(), settings.cp_DefaultSession.cp_Design.cp_BackgroundImage);
+ dpStylePreview.reload(xMSF);
+ }
+ catch (Exception ex)
+ {
+ ex.printStackTrace();
+ }
+ }
+
+ private class StylesComparator implements Comparator
+ {
+
+ /* (non-Javadoc)
+ * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+ */
+ public int compare(Object o1, Object o2)
+ {
+ // TODO Auto-generated method stub
+ if (o1 instanceof CGStyle && o2 instanceof CGStyle)
+ {
+ return ((CGStyle) o1).cp_Name.compareTo(
+ ((CGStyle) o2).cp_Name);
+ }
+ else
+ {
+ throw new IllegalArgumentException("Cannot compare objects which are not CGStyle.");
+ }
+ }
+ }
+}