blob: ff887fc813808e7e354c6bb116ff2426d76cc59e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2007 Oracle Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.editors.palette;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import javax.xml.parsers.DocumentBuilder;
import org.eclipse.gef.palette.PaletteEntry;
import org.eclipse.gef.ui.palette.PaletteCustomizer;
import org.eclipse.gef.ui.palette.PaletteViewer;
import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
import org.eclipse.jface.preference.IPersistentPreferenceStore;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
import org.eclipse.jst.pagedesigner.utils.XMLUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
* Helper class that all clients should use when dealing with palette customizations
*/
public final class DesignerPaletteCustomizationsHelper {
private static final String PREFS_TAGLIBHIDE_PREFIX = "hidden_taglib:"; //$NON-NLS-1$
private static Logger _log = PDPlugin.getLogger(DesignerPaletteCustomizationsHelper.class);
/**
* @return new DesignerPaletteCustomizer
*/
public static DesignerPaletteCustomizer getNewCustomizer(){
return new DesignerPaletteCustomizer();
}
/**
* @param paletteViewer
* @param paletteCustomizer
* @return new DesignerPaletteCustomizerDialog
*/
public static PaletteCustomizerDialog getNewCustomizerDialog(PaletteViewer paletteViewer, PaletteCustomizer paletteCustomizer){
return new DesignerPaletteCustomizerDialog(
paletteViewer.getControl().getShell(), paletteCustomizer, (DesignerPaletteRoot)paletteViewer.getPaletteRoot());
}
/**
* Save palette item customizations
* @param paletteRoot
*/
public static void save(DesignerPaletteRoot paletteRoot) {
IPersistentPreferenceStore prefs = getPreferenceStore();
for (Iterator it=paletteRoot.getChildren().iterator();it.hasNext();){
PaletteEntry entry = (PaletteEntry)it.next();
if (entry instanceof TaglibPaletteDrawer){
TaglibPaletteDrawer pd = (TaglibPaletteDrawer)entry;
prefs.putValue(PREFS_TAGLIBHIDE_PREFIX + pd.getURI(), Boolean.toString(! pd.isVisible()));
}
}
PaletteItemManager.notifyPaletteItemManagersOfCustomizationsUpdate(paletteRoot.getPaletteManager());
}
/**
* Load user customizations
* @param paletteItemManager
*/
public static void loadUserCustomizations(IPaletteItemManager paletteItemManager) {
IPreferenceStore store = getPreferenceStore();
for (Iterator it=paletteItemManager.getAllCategories().iterator();it.hasNext();){
TaglibPaletteDrawer tld = (TaglibPaletteDrawer)it.next();
if (store.contains(PREFS_TAGLIBHIDE_PREFIX+tld.getURI())){
tld.setVisible( ! store.getBoolean(PREFS_TAGLIBHIDE_PREFIX+tld.getURI()));
}
}
}
/**
* Hide a category (TaglibPaletteDrawer) that will be persisted as a customization
* @param taglibPaletteDrawer
*/
public static void hideTaglibDrawer(TaglibPaletteDrawer taglibPaletteDrawer){
IPersistentPreferenceStore prefs = getPreferenceStore();
taglibPaletteDrawer.setVisible(false);
prefs.putValue(PREFS_TAGLIBHIDE_PREFIX + taglibPaletteDrawer.getURI(), Boolean.TRUE.toString());
save((DesignerPaletteRoot)taglibPaletteDrawer.getParent());
}
private static IPersistentPreferenceStore getPreferenceStore() {
return (IPersistentPreferenceStore)PDPlugin.getDefault().getPreferenceStore();
}
/**
* Exports the current state of customizations of the current palette instance.
*
* Unsaved data will be exported.
*
* Currently only the "hide" flag of a category is exported. All categories are exported.
*
* @param paletteItemManager
* @param filename
*/
public static void exportCustomizations(IPaletteItemManager paletteItemManager, String filename){
Document document = XMLUtil.getDocumentBuilder().getDOMImplementation()
.createDocument(null, IPaletteConstants.ROOT, null);
try {
FileOutputStream ostream = null;
int index = filename.lastIndexOf(File.separator);
String foldername = filename.substring(0, index);
File folder = new File(foldername);
if (folder != null && !folder.exists()) {
folder.mkdir();
}
ostream = new FileOutputStream(filename);
for (Iterator iter = paletteItemManager.getAllCategories().iterator(); iter.hasNext();) {
TaglibPaletteDrawer category = (TaglibPaletteDrawer) iter
.next();
if (category == null) continue;
Element categoryElement = document.createElement(IPaletteConstants.CATEGORY_TAG);
categoryElement.setAttribute(IPaletteConstants.ID, category.getURI());
categoryElement.setAttribute(IPaletteConstants.ISHIDDEN, Boolean.toString(! category.isVisible()));
document.getDocumentElement().appendChild(categoryElement);
}
XMLUtil.serialize(document, ostream);
ostream.close();
} catch (IOException e) {
_log.error("DesignerPaletteCustomizationsHelper.save.error.IOException", e); //$NON-NLS-1$
}
}
/**
* Imports a palette customization export file.
*
* If there are entries matching in the existing workspace customizations, they will be overridden.
*
* @param customizer
* @param filename
*/
public static void importCustomizations(DesignerPaletteCustomizer customizer, String filename){
Document document = null;
try {
DocumentBuilder builder = XMLUtil.getDocumentBuilder();
if (builder != null) {
document = builder.parse(filename);
} else {
_log.error("DesignerPaletteCustomizationsHelper.importCustomizations.error.getDocumentBuilderFail");// $NON-NLS-1$ //$NON-NLS-1$
}
} catch (FileNotFoundException e) {
//should never get here as user chose file thru a file chooser dialog
_log.error(
"DesignerPaletteCustomizationsHelper.importCustomizations.error.FileNotFoundException");// $NON-NLS-1$ //$NON-NLS-1$
document = null;
} catch (IOException e) {
_log.error(
"DesignerPaletteCustomizationsHelper.importCustomizations.error.IOException", e.toString(), e); //$NON-NLS-1$
} catch (SAXException e) {
_log.error(
"DesignerPaletteCustomizationsHelper.importCustomizations.error.SAXException", e.toString(), e); //$NON-NLS-1$
}
if (document != null) {
Element root = document.getDocumentElement();
if (root != null) {
NodeList catetorylist = root.getChildNodes();
for (int i = 0, n = catetorylist.getLength(); i < n; i++) {
Node childNode = catetorylist.item(i);
if (childNode.getNodeType() == Node.ELEMENT_NODE
&& childNode.getNodeName().equals(
IPaletteConstants.CATEGORY_TAG)) {
Element categoryElement = (Element) childNode;
//only checking for hidden flag currently
if (categoryElement.hasAttribute(IPaletteConstants.ISHIDDEN)){
boolean isHidden =Boolean.valueOf(categoryElement.getAttribute(IPaletteConstants.ISHIDDEN)).booleanValue();
String uri = categoryElement.getAttribute(IPaletteConstants.ID);
applyImport(customizer, uri, isHidden);
}
}
}
}
}
}
private static void applyImport(
DesignerPaletteCustomizer customizer, String uri, boolean isHidden) {
//apply the isHidden exported flag to the paletteRoot child if present
for (Iterator it=customizer.getDesignerPaletteRoot().getChildren().iterator();it.hasNext();){
Object o = it.next();
if (o instanceof TaglibPaletteDrawer){
TaglibPaletteDrawer pd = (TaglibPaletteDrawer)o;
if (uri.equals(pd.getURI())){
pd.setVisible(! isHidden);
break;
}
}
}
}
}