/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2008 by Sun Microsystems, Inc.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* $RCSfile: BackgroundsDialog.java,v $
* $Revision: 1.7 $
*
* 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 javax.swing.DefaultListModel;
import com.sun.star.awt.Size;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.wizards.common.ConfigSet;
import com.sun.star.wizards.common.Configuration;
import com.sun.star.wizards.common.FileAccess;
import com.sun.star.wizards.common.SystemDialog;
import com.sun.star.wizards.ui.ImageList;
import com.sun.star.wizards.web.data.CGImage;
import com.sun.star.wizards.web.data.CGSettings;
/**
* @author rpiterman
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class BackgroundsDialog extends ImageListDialog {
private FileAccess fileAccess;
private SystemDialog sd;
private CGSettings settings;
/**
* @param xmsf
*/
public BackgroundsDialog(
XMultiServiceFactory xmsf,
ConfigSet set_, WebWizardDialogResources resources) throws Exception {
super(xmsf, WWHID.HID_BG, new String[] {
resources.resBackgroundsDialog,
resources.resBackgroundsDialogCaption,
resources.resOK,
resources.resCancel,
resources.resHelp,
resources.resDeselect,
resources.resOther,
resources.resCounter
} );
sd = SystemDialog.createOpenDialog(xmsf);
sd.addFilter(resources.resImages,"*.jpg;*.jpeg;*.jpe;*.gif",true);
sd.addFilter(resources.resAllFiles,"*.*",false);
settings = (CGSettings)set_.root;
fileAccess = new FileAccess(xmsf);
il.setListModel(new Model(set_));
il.setImageSize( new Size(40,40));
il.setRenderer(new BGRenderer(0));
build();
}
/**
* trigered when the user clicks the "other" button.
* opens a "file open" dialog, adds the selected
* image to the list and to the web wizard configuration,
* and then jumps to the new image, selecting it in the list.
* @see add(String)
*/
public void other() {
String filename[] = sd.callOpenDialog(false,settings.cp_DefaultSession.cp_InDirectory);
if (filename != null && filename.length > 0 && filename[0] != null) {
settings.cp_DefaultSession.cp_InDirectory = FileAccess.getParentDir(filename[0]);
int i = add(filename[0]);
il.setSelected(i);
il.display(i);
}
}
/**
* adds the given image to the image list (to the model)
* and to the web wizard configuration.
* @param s
* @return
*/
private int add(String s) {
//first i check the item does not already exists in the list...
for (int i = 0; i<il.getListModel().getSize(); i++)
if (il.getListModel().getElementAt(i).equals(s))
return i;
((DefaultListModel)il.getListModel()).addElement(s);
try {
Object configView = Configuration.getConfigurationRoot(xMSF,FileAccess.connectURLs(WebWizardConst.CONFIG_PATH , "BackgroundImages"),true);
int i = Configuration.getChildrenNames(configView).length + 1;
Object o = Configuration.addConfigNode(configView,"" + i);
Configuration.set(s, "Href",o);
Configuration.commit(configView);
}
catch (Exception ex) {
ex.printStackTrace();
}
return il.getListModel().getSize() - 1;
}
/**
* an ImageList Imagerenderer implemtation.
* The image URL is the object given from the list model.
* the image name, got from the "render" method is
* the filename portion of the url.
* @author rpiterman
*
*/
private class BGRenderer implements ImageList.ImageRenderer {
private int cut;
public BGRenderer(int cut_) {
cut = cut_;
}
public Object[] getImageUrls(Object listItem) {
Object[] sRetUrls;
if (listItem != null){
sRetUrls = new Object[1];
sRetUrls[0] = listItem;
return sRetUrls;
}
return null;
}
public String render(Object object) {
return object == null ? "" :
FileAccess.getPathFilename(fileAccess.getPath((String)object,null));
}
}
/**
* This is a list model for the image list of the
* backgrounds dialog.
* It takes the Backgrounds config set as an argument,
* and "parses" it to a list of files:
* It goes through each image in the set, and checks it:
* if it is a directory it lists all image files in this directory.
* if it is a file, it adds the file to the list.
* @author rpiterman
*/
private class Model extends DefaultListModel {
/**
* constructor. </br>
* see class description for a description of
* the handling of the given model
* @param model the configuration set of the background images.
*/
public Model(ConfigSet model) {
try {
for (int i = 0; i<model.getSize(); i++) {
CGImage image = (CGImage)model.getElementAt(i);
String path = sd.xStringSubstitution.substituteVariables(image.cp_Href,false);
if (fileAccess.exists(path,false))
addDir(path);
else
remove((String)model.getKey(image));
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* when instanciating the model, it checks if each image
* exists. If it doesnot, it will be removed from
* the configuration.
* This is what this method does...
* @param imageName
*/
private void remove(String imageName) {
try {
Object conf = Configuration.getConfigurationRoot(xMSF,WebWizardConst.CONFIG_PATH + "/BackgroundImages",true);
Configuration.removeNode(conf,imageName);
}
catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* if the given url is a directory
* adds the images in the given directory,
* otherwise (if it is a file) adds the file to the list.
* @param url
*/
private void addDir(String url) {
if (fileAccess.isDirectory(url))
add(fileAccess.listFiles(url,false));
else
add(url);
}
/**
* adds the given filenames (urls) to
* the list
* @param filenames
*/
private void add(String[] filenames) {
for (int i = 0; i<filenames.length; i++)
add(filenames[i]);
}
/**
* adds the given image url to the list.
* if and only if it ends with jpg, jpeg or gif
* (case insensitive)
* @param filename image url.
*/
private void add(String filename) {
String lcase = filename.toLowerCase();
if (lcase.endsWith("jpg") ||
lcase.endsWith("jpeg") ||
lcase.endsWith("gif")
)
Model.this.addElement(filename);
}
}
}