blob: 6e47e2b2b9364fde3eede7305ddb762afe50d010 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
package com.sun.star.wizards.web;
import javax.swing.ListModel;
import com.sun.star.awt.KeyEvent;
import com.sun.star.awt.XControl;
import com.sun.star.awt.XKeyListener;
import com.sun.star.awt.XWindow;
import com.sun.star.container.NoSuchElementException;
import com.sun.star.lang.EventObject;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.util.XCloseable;
import com.sun.star.wizards.common.Configuration;
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.common.PropertyNames;
import com.sun.star.wizards.ui.UnoDialog;
import com.sun.star.wizards.ui.event.DataAware;
import com.sun.star.wizards.ui.event.ListModelBinder;
import com.sun.star.wizards.ui.event.Task;
import com.sun.star.wizards.web.data.CGDocument;
import com.sun.star.wizards.web.data.CGPublish;
import com.sun.star.wizards.web.data.CGSession;
import com.sun.star.wizards.web.data.CGSessionName;
/**
* This class implements the ui-events of the
* web wizard.
* it is therfore sorted to steps.
* not much application-logic here - just plain
* methods which react to events.
* The only exception are the finish methods with the save
* session methods.
*/
public abstract class WWD_Events extends WWD_Startup
{
private static final short[] EMPTY_SHORT_ARRAY = new short[0];
/**
* Tracks the current loaded session.
* If PropertyNames.EMPTY_STRING - it means the current session is the default one (empty)
* If a session is loaded, this will be the name of the loaded session.
*/
protected String currentSession = PropertyNames.EMPTY_STRING;
/**
* He - my constructor !
* I add a window listener, which, when
* the window closes, deltes the temp directory.
*/
public WWD_Events(XMultiServiceFactory xmsf) throws Exception
{
super(xmsf);
Create c = new Create();
XWindow xWindow = UnoRuntime.queryInterface(XWindow.class, chkFTP);
xWindow.addKeyListener(c);
xWindow = UnoRuntime.queryInterface(XWindow.class, chkLocalDir);
xWindow.addKeyListener(c);
xWindow = UnoRuntime.queryInterface(XWindow.class, chkZip);
xWindow.addKeyListener(c);
}
/* *********************************************************
* *******************************************************
* EVENT and UI METHODS
* *******************************************************
* *********************************************************/
protected void leaveStep(int nOldStep, int nNewStep)
{
if (nOldStep == 1 && nNewStep == 2)
{
// 1. check if the selected session is the same as the current one.
}
}
protected void enterStep(int old, int newStep)
{
if ((old == 1))
{
String sessionToLoad = PropertyNames.EMPTY_STRING;
short[] s = (short[]) Helper.getUnoPropertyValue(getModel(lstLoadSettings), PropertyNames.SELECTED_ITEMS);
if (s.length == 0 || s[0] == 0)
{
sessionToLoad = PropertyNames.EMPTY_STRING;
}
else
{
sessionToLoad = ((CGSessionName) settings.cp_SavedSessions.getElementAt(s[0])).cp_Name;
}
if (!sessionToLoad.equals(currentSession))
{
loadSession(sessionToLoad);
}
}
if (newStep == 5)
{
}
}
/* *********************************
* STEP 1
*/
/**
* Called from the Uno event dispatcher when the
* user selects a saved session.
*/
public void sessionSelected()
{
short[] s = (short[]) Helper.getUnoPropertyValue(getModel(lstLoadSettings), PropertyNames.SELECTED_ITEMS);
setEnabled(btnDelSession, s.length > 0 && s[0] > 0);
}
/**
* Ha ! the session should be loaded :-)
*/
public void loadSession(final String sessionToLoad)
{
try
{
final StatusDialog sd = getStatusDialog();
final Task task = new Task("LoadDocs", PropertyNames.EMPTY_STRING, 10);
sd.execute(this, task, resources.resLoadingSession);
task.start();
setSelectedDoc(EMPTY_SHORT_ARRAY);
Helper.setUnoPropertyValue(getModel(lstDocuments), PropertyNames.SELECTED_ITEMS, EMPTY_SHORT_ARRAY);
Helper.setUnoPropertyValue(getModel(lstDocuments), PropertyNames.STRING_ITEM_LIST, EMPTY_STRING_ARRAY);
Object view = null;
if (sessionToLoad.equals(PropertyNames.EMPTY_STRING))
{
view = Configuration.getConfigurationRoot(xMSF, CONFIG_PATH + "/DefaultSession", false);
}
else
{
view = Configuration.getConfigurationRoot(xMSF, CONFIG_PATH + "/SavedSessions", false);
view = Configuration.getNode(sessionToLoad, view);
}
CGSession session = new CGSession();
session.setRoot(settings);
session.readConfiguration(view, CONFIG_READ_PARAM);
task.setMax(session.cp_Content.cp_Documents.getSize() * 5 + 7);
task.advance(true);
if (sessionToLoad.equals(PropertyNames.EMPTY_STRING))
{
setSaveSessionName(session);
}
mount(session, task, false, sd.xControl);
checkSteps();
currentSession = sessionToLoad;
while (task.getStatus() <= task.getMax())
{
task.advance(false);
}
task.removeTaskListener(sd);
}
catch (Exception ex)
{
unexpectedError(ex);
}
try
{
refreshStylePreview();
updateIconsetText();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* hmm. the user clicked the delete button.
*/
public void delSession()
{
short[] selected = (short[]) Helper.getUnoPropertyValue(getModel(lstLoadSettings), PropertyNames.SELECTED_ITEMS);
if (selected.length == 0)
{
return;
}
if (selected[0] == 0)
{
return;
}
boolean confirm = AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(), resources.resDelSessionConfirm, ErrorHandler.ERROR_QUESTION_NO);
if (confirm)
{
try
{
String name = (String) settings.cp_SavedSessions.getKey(selected[0]);
// first delete the session from the registry/configuration.
Configuration.removeNode(xMSF, CONFIG_PATH + "/SavedSessions", name);
// then delete the session from the java-set (settings.cp_SavedSessions)
settings.cp_SavedSessions.remove(selected[0]);
settings.savedSessions.remove(selected[0] - 1);
short[] nextSelected = new short[]
{
(short) 0
};
// We try to select the same item index again, if possible
if (settings.cp_SavedSessions.getSize() > selected[0])
{
nextSelected[0] = selected[0];
}
else
// this will always be available because
// the user can not remove item 0.
{
nextSelected[0] = (short) (selected[0] - 1); // if the <none> session will be selected, disable the remove button...
}
if (nextSelected[0] == 0)
{
Helper.setUnoPropertyValue(getModel(btnDelSession), PropertyNames.PROPERTY_ENABLED, Boolean.FALSE); // select...
}
Helper.setUnoPropertyValue(getModel(lstLoadSettings), PropertyNames.SELECTED_ITEMS, nextSelected);
//ListModelBinder.fillComboBox(cbSaveSettings, settings.savedSessions.items(), null);
}
catch (Exception ex)
{
ex.printStackTrace();
unexpectedError(ex);
}
}
}
/* ********************************
* STEP 2
*/
/**
* A method used by the UnoDataAware attached
* to the Documents listbox.
* See the concept of the DataAware objects to undestand
* why it is there...
*/
public short[] getSelectedDoc()
{
return selectedDoc;
}
private static String[] EMPTY_STRING_ARRAY = new String[0];
/* public void loadSessionSelected() {
UIHelper.setEnabled(btnLoadSession,true);
UIHelper.setEnabled(btnDelSession,true);
}
*/
/**
* when the user clicks another document
* in the listbox, this method is called,
* and couses the display in
* the textboxes title,description, author and export format
* to change
*/
public void setSelectedDoc(short[] s)
{
CGDocument oldDoc = getDoc(selectedDoc);
CGDocument doc = getDoc(s);
if (doc == null)
{
fillExportList(EMPTY_STRING_ARRAY);
//I try to avoid refreshing the export list if
//the same type of document is chosen.
}
else if (oldDoc == null || (!oldDoc.appType.equals(doc.appType)))
{
fillExportList(settings.getExporters(doc.appType));
}
selectedDoc = s;
mount(doc, docAware);
disableDocUpDown();
}
/**
* The user clicks the "Add" button.
* This will open a "FileOpen" dialog,
* and, if the user chooses more than one file,
* will open a status dialog, when validating each document.
*/
public void addDocument()
{
final String[] files = getDocAddDialog().callOpenDialog(true, settings.cp_DefaultSession.cp_InDirectory);
if (files == null)
{
return;
}
final Task task = new Task(PropertyNames.EMPTY_STRING, PropertyNames.EMPTY_STRING, files.length * 5);
/*
* If more than a certain number
* of documents have been added,
* open the status dialog.
*/
if (files.length > MIN_ADD_FILES_FOR_DIALOG)
{
StatusDialog sd = getStatusDialog();
sd.setLabel(resources.resValidatingDocuments);
sd.execute(this, task, resources.prodName); // new LoadDocs( sd.xControl, files, task )
LoadDocs oLoadDocs = new LoadDocs(this.xControl, files, task);
oLoadDocs.loadDocuments();
task.removeTaskListener(sd);
}
/*
* When adding a single document, do not use a
* status dialog...
*/
else
{
LoadDocs oLoadDocs = new LoadDocs(this.xControl, files, task);
oLoadDocs.loadDocuments();
}
}
/**
* The user clicked delete.
*/
public void removeDocument()
{
if (selectedDoc.length == 0)
{
return;
}
settings.cp_DefaultSession.cp_Content.cp_Documents.remove(selectedDoc[0]);
// update the selected document
while (selectedDoc[0] >= getDocsCount())
{
selectedDoc[0]--; // if there are no documents...
}
if (selectedDoc[0] == -1)
{
selectedDoc = EMPTY_SHORT_ARRAY; // update the list to show the right selection.
}
docListDA.updateUI();
// disables all the next steps, if the list of docuemnts
// is empty.
checkSteps();
}
/**
* doc up.
*/
public void docUp()
{
Object doc = settings.cp_DefaultSession.cp_Content.cp_Documents.getElementAt(selectedDoc[0]);
settings.cp_DefaultSession.cp_Content.cp_Documents.remove(selectedDoc[0]);
settings.cp_DefaultSession.cp_Content.cp_Documents.add(--selectedDoc[0], doc);
docListDA.updateUI();
disableDocUpDown();
}
/**
* doc down
*/
public void docDown()
{
Object doc = settings.cp_DefaultSession.cp_Content.cp_Documents.getElementAt(selectedDoc[0]);
settings.cp_DefaultSession.cp_Content.cp_Documents.remove(selectedDoc[0]);
settings.cp_DefaultSession.cp_Content.cp_Documents.add(++selectedDoc[0], doc);
docListDA.updateUI();
disableDocUpDown();
}
/* ******************************
* STEP 5
*/
/**
* invoked when the user clicks "Choose backgrounds" button.
*/
private ImageListDialog bgDialog;
/**
* the user clicked the "backgrounds" button
*/
public void chooseBackground()
{
try
{
setEnabled(btnBackgrounds, false);
if (bgDialog == null)
{
bgDialog = new BackgroundsDialog(xMSF, settings.cp_BackgroundImages, resources);
bgDialog.createWindowPeer(xControl.getPeer());
}
bgDialog.setSelected(settings.cp_DefaultSession.cp_Design.cp_BackgroundImage);
short i = bgDialog.executeDialog((UnoDialog) WWD_Events.this);
if (i == 1) //ok
{
setBackground(bgDialog.getSelected());
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
setEnabled(btnBackgrounds, true);
}
}
/**
* invoked when the BackgorundsDialog is "OKed".
*/
public void setBackground(Object background)
{
if (background == null)
{
background = PropertyNames.EMPTY_STRING;
}
settings.cp_DefaultSession.cp_Design.cp_BackgroundImage = (String) background;
refreshStylePreview();
}
private IconsDialog iconsDialog;
/**
* is called when the user clicks "Icon sets" button.
*
*/
public void chooseIconset()
{
try
{
setEnabled(btnIconSets, false);
if (iconsDialog == null)
{
iconsDialog = new IconsDialog(xMSF, settings.cp_IconSets, resources);
iconsDialog.createWindowPeer(xControl.getPeer());
}
iconsDialog.setIconset(settings.cp_DefaultSession.cp_Design.cp_IconSet);
short i = iconsDialog.executeDialog((UnoDialog) WWD_Events.this);
if (i == 1) //ok
{
setIconset(iconsDialog.getIconset());
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
setEnabled(btnIconSets, true);
}
}
/**
* invoked when the Iconsets Dialog is OKed.
*/
public void setIconset(String icon)
{
settings.cp_DefaultSession.cp_Design.cp_IconSet = icon;
updateIconsetText();
}
/* ******************************
* STEP 7
*/
/**
* sets the publishing url of either a local/zip or ftp publisher.
* updates the ui....
*/
private CGPublish setPublishUrl(String publisher, String url, int number)
{
if (url == null)
{
return null;
}
CGPublish p = getPublisher(publisher);
p.cp_URL = url;
p.cp_Publish = true;
updatePublishUI(number);
p.overwriteApproved = true;
return p;
}
/**
* updates the ui of a certain publisher
* (the text box url)
* @param number
*/
private void updatePublishUI(int number)
{
((DataAware) pubAware.get(number)).updateUI();
((DataAware) pubAware.get(number + 1)).updateUI();
checkPublish();
}
/**
* The user clicks the local "..." button.
*
*/
public void setPublishLocalDir()
{
String dir = showFolderDialog("Local destination directory", PropertyNames.EMPTY_STRING, settings.cp_DefaultSession.cp_OutDirectory);
//if ok was pressed...
setPublishUrl(LOCAL_PUBLISHER, dir, 0);
}
/**
* The user clicks the "Configure" FTP button.
*
*/
public void setFTPPublish()
{
if (showFTPDialog(getPublisher(FTP_PUBLISHER)))
{
getPublisher(FTP_PUBLISHER).cp_Publish = true;
updatePublishUI(2);
}
}
/**
* show the ftp dialog
* @param pub
* @return true if OK was pressed, otherwise false.
*/
private boolean showFTPDialog(CGPublish pub)
{
try
{
return getFTPDialog(pub).execute(this) == 1;
}
catch (Exception ex)
{
ex.printStackTrace();
return false;
}
}
/**
* the user clicks the zip "..." button.
* Choose a zip file...
*/
public void setZipFilename()
{
SystemDialog sd = getZipDialog();
String zipFile = sd.callStoreDialog(settings.cp_DefaultSession.cp_OutDirectory, resources.resDefaultArchiveFilename);
setPublishUrl(ZIP_PUBLISHER, zipFile, 4);
getPublisher(ZIP_PUBLISHER).overwriteApproved = true;
}
private TOCPreview docPreview;
/**
* the user clicks the "Preview" button.
*/
public void documentPreview()
{
try
{
if (docPreview == null)
{
docPreview = new TOCPreview(xMSF, settings, resources, stylePreview.tempDir, myFrame);
}
docPreview.refresh(settings);
}
catch (Exception ex)
{
unexpectedError(ex);
}
}
/* **********************
* FINISH
*/
/**
* This method checks if the given target's path, added the pathExtension argument,
* exists, and asks the user what to do about it.
* If the user says its all fine, then the target will
* be replaced.
* @return true if "create" should continue. false if "create" should abort.
*/
private boolean publishTargetApproved()
{
boolean result = true;
// 1. check local publish target
CGPublish p = getPublisher(LOCAL_PUBLISHER);
// should publish ?
if (p.cp_Publish)
{
String path = getFileAccess().getPath(p.url, null);
// target exists?
if (getFileAccess().exists(p.url, false))
{
//if its a directory
if (getFileAccess().isDirectory(p.url))
{
//check if its empty
String[] files = getFileAccess().listFiles(p.url, true);
if (files.length > 0)
{
/* it is not empty :-(
* it either a local publisher or an ftp (zip uses no directories
* as target...)
*/
String message = JavaTools.replaceSubString(resources.resLocalTragetNotEmpty,
path, "%FILENAME");
result = AbstractErrorHandler.showMessage(
xMSF, xControl.getPeer(), message,
ErrorHandler.MESSAGE_WARNING, ErrorHandler.BUTTONS_YES_NO,
ErrorHandler.DEF_NO, ErrorHandler.RESULT_YES);
if (!result)
{
return result;
}
}
}
else
{//not a directory, but still exists
String message = JavaTools.replaceSubString(resources.resLocalTargetExistsAsfile,
path, "%FILENAME");
AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(), message, ErrorHandler.ERROR_PROCESS_FATAL);
return false;
}
// try to write to the path...
}
else
{
// the local target directory does not exist.
String message = JavaTools.replaceSubString(resources.resLocalTargetCreate,
path, "%FILENAME");
try
{
result = AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(), message,
ErrorHandler.ERROR_QUESTION_YES);
}
catch (Exception ex)
{
ex.printStackTrace();
}
if (!result)
{
return result;
// try to create the directory...
}
try
{
getFileAccess().fileAccess.createFolder(p.cp_URL);
}
catch (Exception ex)
{
message = JavaTools.replaceSubString(resources.resLocalTargetCouldNotCreate,
path, "%FILENAME");
AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(), message,
ErrorHandler.ERROR_PROCESS_FATAL);
return false;
}
}
}
// 2. Check ZIP
// should publish ?
p = getPublisher(ZIP_PUBLISHER);
if (p.cp_Publish)
{
String path = getFileAccess().getPath(p.cp_URL, null);
// target exists?
if (getFileAccess().exists(p.cp_URL, false))
{
//if its a directory
if (getFileAccess().isDirectory(p.cp_URL))
{
String message = JavaTools.replaceSubString(resources.resZipTargetIsDir,
path, "%FILENAME");
AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(), message,
ErrorHandler.ERROR_PROCESS_FATAL);
return false;
}
else
{//not a directory, but still exists ( a file...)
if (!p.overwriteApproved)
{
String message = JavaTools.replaceSubString(resources.resZipTargetExists,
path, "%FILENAME");
result = AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(), message,
ErrorHandler.ERROR_QUESTION_YES);
if (!result)
{
return false;
}
}
}
}
}
// 3. check FTP
p = getPublisher(FTP_PUBLISHER);
// should publish ?
if (p.cp_Publish)
{
String path = getFileAccess().getPath(p.cp_URL, null);
// target exists?
if (getFileAccess().exists(p.url, false))
{
//if its a directory
if (getFileAccess().isDirectory(p.url))
{
//check if its empty
String[] files = getFileAccess().listFiles(p.url, true);
if (files.length > 0)
{
/* it is not empty :-(
* it either a local publisher or an ftp (zip uses no directories
* as target...)
*/
String message = JavaTools.replaceSubString(resources.resFTPTargetNotEmpty,
path, "%FILENAME");
result = AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(), message,
ErrorHandler.ERROR_QUESTION_CANCEL);
if (!result)
{
return result;
}
}
}
else
{//not a directory, but still exists (as a file)
String message = JavaTools.replaceSubString(resources.resFTPTargetExistsAsfile,
path, "%FILENAME");
AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(), message,
ErrorHandler.ERROR_PROCESS_FATAL);
return false;
}
// try to write to the path...
}
else
{
// the ftp target directory does not exist.
String message = JavaTools.replaceSubString(resources.resFTPTargetCreate,
path, "%FILENAME");
result = AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(), message,
ErrorHandler.ERROR_QUESTION_YES);
if (!result)
{
return result;
// try to create the directory...
}
try
{
getFileAccess().fileAccess.createFolder(p.url);
}
catch (Exception ex)
{
message = JavaTools.replaceSubString(resources.resFTPTargetCouldNotCreate,
path, "%FILENAME");
AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(), message,
ErrorHandler.ERROR_PROCESS_FATAL);
return false;
}
}
}
return true;
}
/*
* return false if "create" should be aborted. true if everything is fine.
*/
private boolean saveSession()
{
try
{
Object node = null;
String name = getSessionSaveName();
//set documents index field.
ListModel docs = settings.cp_DefaultSession.cp_Content.cp_Documents;
for (int i = 0; i < docs.getSize(); i++)
{
((CGDocument) docs.getElementAt(i)).cp_Index = i;
}
Object conf = Configuration.getConfigurationRoot(xMSF, CONFIG_PATH + "/SavedSessions", true);
// first I check if a session with the given name exists
try
{
node = Configuration.getNode(name, conf);
if (node != null)
{
if (!AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(),
JavaTools.replaceSubString(resources.resSessionExists, name, "${NAME}"),
ErrorHandler.ERROR_NORMAL_IGNORE))
{
return false; //remove the old session
}
}
Configuration.removeNode(conf, name);
}
catch (NoSuchElementException nsex)
{
}
settings.cp_DefaultSession.cp_Index = 0;
node = Configuration.addConfigNode(conf, name);
settings.cp_DefaultSession.cp_Name = name;
settings.cp_DefaultSession.writeConfiguration(node, CONFIG_READ_PARAM);
settings.cp_SavedSessions.reindexSet(conf, name, "Index");
Configuration.commit(conf);
// now I reload the sessions to actualize the list/combo boxes load/save sessions.
settings.cp_SavedSessions.clear();
Object confView = Configuration.getConfigurationRoot(xMSF, CONFIG_PATH + "/SavedSessions", false);
settings.cp_SavedSessions.readConfiguration(confView, CONFIG_READ_PARAM);
settings.cp_LastSavedSession = name;
currentSession = name;
// now save the name of the last saved session...
settings.cp_LastSavedSession = name;
// TODO add the <none> session...
prepareSessionLists();
ListModelBinder.fillList(lstLoadSettings, settings.cp_SavedSessions.items(), null);
ListModelBinder.fillComboBox(cbSaveSettings, settings.savedSessions.items(), null);
selectSession();
currentSession = settings.cp_LastSavedSession;
return true;
}
catch (Exception ex)
{
ex.printStackTrace();
return false;
}
}
private String targetStringFor(String publisher)
{
CGPublish p = getPublisher(publisher);
if (p.cp_Publish)
{
return "\n" + getFileAccess().getPath(p.cp_URL, null);
}
else
{
return PropertyNames.EMPTY_STRING;
}
}
/**
* this method will be called when the Status Dialog
* is hidden.
* It checks if the "Process" was successfull, and if so,
* it closes the wizard dialog.
*/
public void finishWizardFinished()
{
if (process.getResult())
{
String targets =
targetStringFor(LOCAL_PUBLISHER) +
targetStringFor(ZIP_PUBLISHER) +
targetStringFor(FTP_PUBLISHER);
String message = JavaTools.replaceSubString(resources.resFinishedSuccess, targets, "%FILENAME");
AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(), message, ErrorHandler.ERROR_MESSAGE);
if (exitOnCreate)
{
this.xDialog.endExecute();
}
}
else
{
AbstractErrorHandler.showMessage(xMSF, xControl.getPeer(), resources.resFinishedNoSuccess, ErrorHandler.ERROR_WARNING);
}
}
public void cancel()
{
xDialog.endExecute();
}
private Process process;
private boolean exitOnCreate = true;
/**
* the user clicks the finish/create button.
*/
public boolean finishWizard()
{
finishWizard(true);
return true;
}
/**
* finish the wizard
* @param exitOnCreate_ should the wizard close after
* a successfull create.
* Default is true,
* I have a hidden feature which enables false here
*/
public void finishWizard(boolean exitOnCreate_)
{
exitOnCreate = exitOnCreate_;
/**
* First I check if ftp password was set, if not - the ftp dialog pops up...
* This may happen when a session is loaded, since the
* session saves the ftp url and username, but not the password.
*/
final CGPublish p = getPublisher(FTP_PUBLISHER);
// if ftp is checked, and no proxies are set, and password is empty...
if (p.cp_Publish && (!proxies) && (p.password == null || p.password.equals(PropertyNames.EMPTY_STRING)))
{
if (showFTPDialog(p))
{
updatePublishUI(2);
//now continue...
finishWizard2();
}
}
else
{
finishWizard2();
}
}
/**
* this method is only called
* if ftp-password was eather set, or
* the user entered one in the FTP Dialog which
* popped up when clicking "Create".
*
*/
private void finishWizard2()
{
CGPublish p = getPublisher(LOCAL_PUBLISHER);
p.url = p.cp_URL;
/*
* zip publisher is using another url form...
*/
p = getPublisher(ZIP_PUBLISHER);
//replace the '%' with '%25'
String url1 = JavaTools.replaceSubString(p.cp_URL, "%25", "%");
//replace all '/' with '%2F'
url1 = JavaTools.replaceSubString(url1, "%2F", "/");
p.url = "vnd.sun.star.zip://" + url1 + "/";
/*
* and now ftp...
*/
p = getPublisher(FTP_PUBLISHER);
p.url = FTPDialog.getFullURL(p);
/* first we check the publishing targets. If they exist we warn and ask
* what to do. a False here means the user said "cancel" (or rather: clicked...)
*/
if (!publishTargetApproved())
{
return;
/*
* In order to save the session correctly,
* I return the value of the ftp publisher cp_Publish
* property to its original value...
*/
}
p.cp_Publish = __ftp;
//if the "save settings" checkbox is on...
if (isSaveSession())
{
// if canceled by user
if (!saveSession())
{
return;
}
}
else
{
settings.cp_LastSavedSession = PropertyNames.EMPTY_STRING;
}
try
{
Object conf = Configuration.getConfigurationRoot(xMSF, CONFIG_PATH, true);
Configuration.set(
settings.cp_LastSavedSession,
"LastSavedSession", conf);
Configuration.commit(conf);
}
catch (Exception ex)
{
ex.printStackTrace();
}
/*
* again, if proxies are on, I disable ftp before the creation process
* starts.
*/
if (proxies)
{
p.cp_Publish = false;
/*
* There is currently a bug, which crashes office when
* writing folders to an existing zip file, after deleting
* its content, so I "manually" delete it here...
*/
}
p = getPublisher(ZIP_PUBLISHER);
if (getFileAccess().exists(p.cp_URL, false))
{
getFileAccess().delete(p.cp_URL);
}
try
{
ErrorHandler eh = new ProcessErrorHandler(xMSF, xControl.getPeer(), resources);
process = new Process(settings, xMSF, eh);
StatusDialog pd = getStatusDialog();
pd.setRenderer(new ProcessStatusRenderer(resources));
pd.execute(this, process.myTask, resources.prodName); //process,
process.runProcess();
finishWizardFinished();
process.myTask.removeTaskListener(pd);
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
/**
* implements a hidden feature for "finishing" without
* closing the wizard.
* press "&%" quite fast when the focus is on one
* of the last steps' checkboxes.
* @author rp143992
*/
private class Create implements XKeyListener
{
long time = 0;
int count = 0;
/* (non-Javadoc)
* @see com.sun.star.awt.XKeyListener#keyPressed(com.sun.star.awt.KeyEvent)
*/
public void keyPressed(KeyEvent ke)
{
if (ke.KeyChar == '&')
{
time = System.currentTimeMillis();
}
else if (ke.KeyChar == '%' && ((System.currentTimeMillis() - time) < 300))
{
Boolean b = (Boolean) getControlProperty("btnWizardFinish", PropertyNames.PROPERTY_ENABLED);
if (b.booleanValue())
{
finishWizard(false);
}
}
}
public void keyReleased(KeyEvent arg0)
{
}
public void disposing(EventObject arg0)
{
}
}
/**
* is called on the WindowHidden event,
* deletes the temporary directory.
*/
public void cleanup()
{
try
{
dpStylePreview.dispose();
}
catch (Exception ex)
{
ex.printStackTrace();
}
stylePreview.cleanup();
try
{
if (bgDialog != null)
{
bgDialog.xComponent.dispose();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
try
{
if (iconsDialog != null)
{
iconsDialog.xComponent.dispose();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
try
{
if (ftpDialog != null)
{
ftpDialog.xComponent.dispose();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
try
{
xComponent.dispose();
}
catch (Exception ex)
{
ex.printStackTrace();
}
try
{
//XCloseable xCloseable = (XCloseable) UnoRuntime.queryInterface(XCloseable.class, myDocument);
//if (xCloseable != null)
// xCloseable.close(false);
XCloseable xCloseable = UnoRuntime.queryInterface(XCloseable.class, myFrame);
if (xCloseable != null)
{
xCloseable.close(false);
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
public class LoadDocs
{
private XControl xC;
String[] files;
Task task;
public LoadDocs(XControl xC_, String[] files_, Task task_)
{
xC = xC_;
files = files_;
task = task_;
}
public void loadDocuments()
{
//LogTaskListener lts = new LogTaskListener();
//task.addTaskListener(lts);
// task.start();
// where the documents are added to in the list (offset)
int offset = (getSelectedDoc().length > 0 ? selectedDoc[0] + 1 : getDocsCount());
/* if the user chose one file, the list starts at 0,
* if he chose more than one, the first entry is a directory name,
* all the others are filenames.
*/
int start = (files.length > 1 ? 1 : 0);
/*
* Number of documents failed to validate.
*/
int failed = 0;
// store the directory
settings.cp_DefaultSession.cp_InDirectory = start == 1 ? files[0] : FileAccess.getParentDir(files[0]);
/*
* Here i go through each file, and validate it.
* If its ok, I add it to the ListModel/ConfigSet
*/
for (int i = start; i < files.length; i++)
{
CGDocument doc = new CGDocument();
doc.setRoot(settings);
doc.cp_URL = (start == 0) ? files[i] : FileAccess.connectURLs(files[0], files[i]);
/* so - i check each document and if it is ok I add it.
* The failed variable is used only to calculate the place to add -
* Error reporting to the user is (or should (-: )done in the checkDocument(...) method
*/
if (checkDocument(doc, task, xC))
{
settings.cp_DefaultSession.cp_Content.cp_Documents.add(offset + i - failed - start, doc);
}
else
{
failed++;
}
}
// if any documents where added,
// set the first one to be the current-selected document.
if (files.length > start + failed)
{
setSelectedDoc(new short[]
{
(short) offset
});
}
// update the ui...
docListDA.updateUI();
// this enables/disables the next steps.
// when no documents in the list, all next steps are disabled
checkSteps();
/* a small insurance that the status dialog will
* really close...
*/
while (task.getStatus() < task.getMax())
{
task.advance(false);
}
}
}
}