blob: f2edb74896f310f7a723421d40851786bb95659d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 Sybase, Inc. 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:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.editors.palette;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.ui.palette.PaletteViewer;
import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
/**
* XXX: currently create this class is just for add/remove listener to
* preference change, so can refresh the palette.
*
* @author mengbo
* @author mengbo
* @version 1.5
*/
public class DesignerPaletteViewer extends PaletteViewer {
private PaletteCustomizerDialog _customizerDialog = null;
/**
*
*/
public DesignerPaletteViewer() {
super();
this.enableVerticalScrollbar(true);
}
Preferences.IPropertyChangeListener listener = new Preferences.IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
PaletteRoot root = getPaletteRoot();
if (root instanceof DesignerPaletteRoot) {
((DesignerPaletteRoot) root).refresh();
// XXX: setActiveTool to null to workaround GEF bug of NPE
// setActiveTool(null);
}
}
};
IEntryChangeListener _paletteModelListener = new IEntryChangeListener() {
public void modelChanged(List oldDefinitions, List newDefinitions) {
PaletteRoot root = getPaletteRoot();
if (root instanceof DesignerPaletteRoot) {
((DesignerPaletteRoot) root).refresh();
}
}
};
IResourceChangeListener _resourceChangeListener = new IResourceChangeListener() {
public void resourceChanged(IResourceChangeEvent event) {
IResourceDeltaVisitor visitor = new IResourceDeltaVisitor() {
public boolean visit(IResourceDelta delta) throws CoreException {
IResource resource = delta.getResource();
// FIXME need make performance better
if (resource.getType() == IResource.FILE
&& (delta.getFlags() & IResourceDelta.CONTENT) != 0) {
String ext = ((IFile) resource).getFileExtension();
// resource.getFullPath().
if (ext != null
&& ("tld".equalsIgnoreCase(ext) || "jar"
.equalsIgnoreCase(ext))) {
PaletteRoot root = getPaletteRoot();
if (root instanceof DesignerPaletteRoot) {
IPaletteItemManager imanager = ((DesignerPaletteRoot) root)
.getPaletteManager();
if (imanager instanceof PaletteItemManager) {
PaletteItemManager manager = (PaletteItemManager) imanager;
manager.reset();
}
}
}
}
return true;
}
};
try {
IResourceDelta delta = event.getDelta();
if (delta != null) {
delta.accept(visitor);
}
} catch (CoreException e) {
// ignore
}
}
};
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.ui.palette.PaletteViewer#hookControl()
*/
protected void hookControl() {
super.hookControl();
PDPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(
listener);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gef.ui.palette.PaletteViewer#unhookControl()
*/
protected void unhookControl() {
PDPlugin.getDefault().getPluginPreferences()
.removePropertyChangeListener(listener);
// remove palette model change listener
PaletteRoot root = getPaletteRoot();
if (root instanceof DesignerPaletteRoot) {
IPaletteItemManager imanager = ((DesignerPaletteRoot) root)
.getPaletteManager();
if (imanager instanceof PaletteItemManager) {
PaletteItemManager manager = (PaletteItemManager) imanager;
ResourcesPlugin.getWorkspace().removeResourceChangeListener(
_resourceChangeListener);
manager.removeEntryChangeListener(_paletteModelListener);
PaletteItemManager.clearPaletteItemManager();
}
}
super.unhookControl();
}
public boolean isFileOpenedInProject(IProject project) {
IWorkbenchPage page = PDPlugin.getDefault().getWorkbench()
.getActiveWorkbenchWindow().getActivePage();
IEditorReference[] editors = page.getEditorReferences();
for (int i = 0; i < editors.length; i++) {
IEditorPart part = (IEditorPart) editors[i].getPart(false);
if (part != null) {
IEditorInput input = part.getEditorInput();
IFile inputFile = null;
if (input != null && input instanceof IFileEditorInput) {
inputFile = ((IFileEditorInput) input).getFile();
IProject refProject = inputFile.getProject();
if (project == refProject) {
return true;
}
}
}
}
return false;
}
public PaletteCustomizerDialog getCustomizerDialog() {
if (_customizerDialog == null) {
_customizerDialog = new DesignerPaletteCustomizerDialog(
getControl().getShell(), getCustomizer(), getPaletteRoot());
}
return _customizerDialog;
}
public void setPaletteRoot(PaletteRoot root) {
// TODO Auto-generated method stub
super.setPaletteRoot(root);
// add palette model change listener
// PaletteRoot root = getPaletteRoot();
if (root instanceof DesignerPaletteRoot) {
((DesignerPaletteRoot) root).getPaletteManager()
.addEntryChangeListener(_paletteModelListener);
ResourcesPlugin.getWorkspace().addResourceChangeListener(
_resourceChangeListener);
}
}
}