/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.ui.views.palette.editor;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.jboss.tools.common.meta.XAttribute;
import org.jboss.tools.common.meta.action.XActionItem;
import org.jboss.tools.common.meta.action.XActionList;
import org.jboss.tools.common.meta.action.XActionItem.Acceptor;
import org.jboss.tools.common.meta.help.HelpUtil;
import org.jboss.tools.common.model.XModelException;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.event.XModelTreeEvent;
import org.jboss.tools.common.model.event.XModelTreeListener;
import org.jboss.tools.common.model.options.PreferenceModelUtilities;
import org.jboss.tools.common.model.options.SharableConstants;
import org.jboss.tools.common.model.options.SharableElement;
import org.jboss.tools.common.model.plugin.ModelPlugin;
import org.jboss.tools.common.model.ui.ModelUIPlugin;
import org.jboss.tools.common.model.ui.navigator.FilteredTreeContentProvider;
import org.jboss.tools.common.model.ui.navigator.NavigatorLabelProvider;
import org.jboss.tools.common.model.ui.navigator.TreeViewerMenuInvoker;
import org.jboss.tools.common.model.ui.navigator.TreeViewerModelListenerImpl;
import org.jboss.tools.common.model.ui.objecteditor.XModelObjectEditor;
import org.jboss.tools.common.model.util.XModelTreeListenerSWTSync;
public class PaletteDialog extends Dialog {
protected TreeViewer treeViewer = null;
protected XModelObjectEditor objectEditor = new XModelObjectEditor();
protected FilteredTreeContentProvider contentProvider = new FilteredTreeContentProvider();
protected TreeViewerModelListenerImpl listener = new TreeViewerModelListenerImpl();
protected XModelTreeListenerSWTSync syncListener = new XModelTreeListenerSWTSync(listener);
protected XModelTreeListener listener2 = new ObjectListener();
protected XModelTreeListenerSWTSync syncListener2 = new XModelTreeListenerSWTSync(listener2);
Button restoreDefaults = null;
TreeViewerMenuInvoker menu = new TreeViewerMenuInvoker() {
protected XActionList getActionList(XModelObject o) {
XActionList l = super.getActionList(o);
if(l != null) {
// Filter out 'Properties' item which is redundant in this editor.
l = (XActionList)l.copy(new Acceptor() {
public boolean accepts(XActionItem item) {
if(item.getName().startsWith("Propert")) { //$NON-NLS-1$
return false;
}
return true;
}
});
}
return l;
}
};
PaletteDialogState state = new PaletteDialogState(this);
SL sl = new SL();
SashForm sash;
Composite control;
public void dispose() {
if (treeViewer!=null && treeViewer.getTree()!=null && !treeViewer.getTree().isDisposed()) {
treeViewer.getTree().removeSelectionListener(sl);
}
sl = null;
treeViewer = null;
if (objectEditor!=null) objectEditor.dispose();
objectEditor = null;
if (syncListener!=null) syncListener.dispose();
syncListener = null;
if (syncListener2 != null) syncListener2.dispose();
syncListener2 = null;
}
public PaletteDialog(Shell shell) {
super(shell);
setShellStyle(getShellStyle() | SWT.RESIZE);
menu.setOnKeyRelease(true);
}
public void create() {
super.create();
getShell().setText("Palette Editor");
state.loadState();
}
protected Control createContents(Composite parent) {
Control c = super.createContents(parent);
createEditorComponents((Composite)getDialogArea());
control = (Composite)c;
PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, ModelUIPlugin.ID_PLUGIN + ".palette_editor"); //$NON-NLS-1$
return c;
}
protected void createEditorComponents(Composite parent) {
SashForm panel = new SashForm(parent, SWT.NONE);
sash = panel;
panel.setLayoutData(new GridData(GridData.FILL_BOTH));
treeViewer = new TreeViewer(panel);
contentProvider.setModel(PreferenceModelUtilities.getPreferenceModel());
contentProvider.setViewer(treeViewer);
contentProvider.setFilteredTreeName("PaletteTree");
treeViewer.setContentProvider(contentProvider);
treeViewer.setLabelProvider(new NavigatorLabelProvider());
treeViewer.setInput(contentProvider);
treeViewer.refresh();
menu.setViewer(treeViewer);
treeViewer.getTree().addMouseListener(menu);
treeViewer.getTree().addKeyListener(menu);
treeViewer.getTree().addSelectionListener(sl);
treeViewer.getTree().setVisible(true);
treeViewer.setAutoExpandLevel(2);
Composite right = new Composite(panel, SWT.NONE);
right.setLayoutData(new GridData(GridData.FILL_BOTH));
GridLayout layout = new GridLayout(1, false);
layout.marginTop = 0;
layout.marginLeft = 0;
layout.marginRight = 0;
layout.marginBottom = 0;
right.setLayout(layout);
Control c = objectEditor.createControl(right);
c.setLayoutData(new GridData(GridData.FILL_BOTH));
restoreDefaults = new Button(right, SWT.NONE);
restoreDefaults.setText("Restore Defaults");
GridData gd = new GridData();
gd.horizontalAlignment = SWT.END;
restoreDefaults.setLayoutData(gd);
restoreDefaults.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
public void widgetSelected(SelectionEvent e) {
restoreDefaults();
}
});
activate();
treeViewer.setAutoExpandLevel(2);
}
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, false);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
/// createButton(parent, IDialogConstants.HELP_ID, IDialogConstants.HELP_LABEL, false);
}
class SL extends SelectionAdapter {
public void widgetSelected(SelectionEvent e) {
XModelObject o = menu.getSelectedModelObject();
objectEditor.setModelObject(o);
if(restoreDefaults != null && !restoreDefaults.isDisposed()) {
SharableElement element = getSelectedElementWithGeneralScope(o);
restoreDefaults.setEnabled(element != null);
}
}
}
protected void okPressed() {
objectEditor.stopEditing();
super.okPressed();
}
public void activate() {
listener.setViewer(treeViewer);
PreferenceModelUtilities.getPreferenceModel().addModelTreeListener(syncListener);
PreferenceModelUtilities.getPreferenceModel().addModelTreeListener(syncListener2);
}
public boolean close() {
state.saveState();
boolean b = super.close();
if(b) {
PreferenceModelUtilities.getPreferenceModel().removeModelTreeListener(syncListener);
PreferenceModelUtilities.getPreferenceModel().removeModelTreeListener(syncListener2);
}
dispose();
return b;
}
protected void buttonPressed(int buttonId) {
if(buttonId == IDialogConstants.HELP_ID) {
HelpUtil.helpEclipse(PreferenceModelUtilities.getPreferenceModel(), "PaletteEditor"); //$NON-NLS-1$
} else {
super.buttonPressed(buttonId);
}
}
class ObjectListener implements XModelTreeListener {
public void nodeChanged(XModelTreeEvent event) {
if(event.getModelObject() == menu.getSelectedModelObject()) {
objectEditor.update();
}
}
public void structureChanged(XModelTreeEvent event) {}
}
private SharableElement getSelectedElementWithGeneralScope(XModelObject o) {
if(!(o instanceof SharableElement)) return null;
SharableElement e = (SharableElement)o;
return e.scopeExists(SharableConstants.GENERAL) ? e : null;
}
private void restoreDefaults() {
XModelObject o = menu.getSelectedModelObject();
SharableElement e = getSelectedElementWithGeneralScope(o);
if(e == null) return;
restoreDefaults(e);
}
private void restoreDefaults(SharableElement e) {
if(!e.scopeExists(SharableConstants.GENERAL)) return;
XAttribute[] as = e.getModelEntity().getAttributes();
for (int i = 0; i < as.length; i++) {
if(!as[i].isVisible()) continue;
String n = as[i].getName();
if("name".equals(n)) continue; //$NON-NLS-1$
String v = e.getAttributeValue(n, SharableConstants.GENERAL);
String cv = e.getAttributeValue(n);
if(cv != null && cv.equals(v)) continue;
try {
e.getModel().editObjectAttribute(e, n, v);
} catch (XModelException exc) {
ModelPlugin.getPluginLog().logError(exc);
}
}
SharableElement[] cs = e.getSharableChildren();
for (int i = 0; i < cs.length; i++) {
restoreDefaults(cs[i]);
}
}
}