blob: ed3b7994bf5dfe6b9bc16c2fcfd46f93f24a0a47 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2016 IBM 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.help.ui.internal.views;
import java.util.ArrayList;
import org.eclipse.help.ui.internal.Messages;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.IPreferenceNode;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.preference.PreferenceManager;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
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;
public class ScopePreferenceDialog extends PreferenceDialog {
private EngineDescriptorManager descManager;
private ArrayList<PendingOperation> pendingOperations;
class PendingOperation {
int action;
EngineDescriptor desc;
public PendingOperation(int action, EngineDescriptor desc) {
this.action = action;
this.desc = desc;
}
}
/**
* The Add button id.
*/
private final static int NEW_ID = IDialogConstants.CLIENT_ID + 1;
/**
* The Remove button id.
*/
private final static int DELETE_ID = IDialogConstants.CLIENT_ID + 2;
public ScopePreferenceDialog(Shell parentShell, PreferenceManager manager, EngineDescriptorManager descManager, boolean editable) {
super(parentShell, manager);
this.descManager = descManager;
}
@Override
protected Control createTreeAreaContents(Composite parent) {
GridLayout layout = new GridLayout();
layout.marginWidth = layout.marginHeight = 0;
Composite container = new Composite(parent, SWT.NULL);
container.setLayout(layout);
Control treeControl = super.createTreeAreaContents(container);
GridData treeGd = (GridData)treeControl.getLayoutData();
GridData gd = new GridData(GridData.FILL_BOTH);
gd.horizontalSpan = 2;
treeControl.setLayoutData(gd);
Button lbutton = createButton(container, NEW_ID, Messages.ScopePreferenceDialog_new, false);
gd = (GridData)lbutton.getLayoutData();
gd.horizontalAlignment = GridData.HORIZONTAL_ALIGN_BEGINNING;
Button rbutton = createButton(container, DELETE_ID, Messages.ScopePreferenceDialog_delete, false);
rbutton.setEnabled(false);
gd = (GridData)rbutton.getLayoutData();
gd.horizontalAlignment = GridData.HORIZONTAL_ALIGN_BEGINNING;
layout.numColumns = 2;
container.setLayoutData(treeGd);
Point size = container.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
treeGd.widthHint = Math.max(treeGd.widthHint, size.x);
return container;
}
@Override
protected TreeViewer createTreeViewer(Composite parent) {
TreeViewer viewer = super.createTreeViewer(parent);
viewer.addSelectionChangedListener(event -> {
IStructuredSelection ssel = (IStructuredSelection) event.getSelection();
Object obj = ssel.getFirstElement();
treeSelectionChanged(obj);
});
return viewer;
}
@Override
protected void buttonPressed(int buttonId) {
switch (buttonId) {
case NEW_ID:
doNew();
break;
case DELETE_ID:
doDelete();
break;
default:
super.buttonPressed(buttonId);
}
}
private void treeSelectionChanged(Object obj) {
boolean removable = false;
if (obj instanceof ScopePreferenceManager.EnginePreferenceNode) {
ScopePreferenceManager.EnginePreferenceNode node = (ScopePreferenceManager.EnginePreferenceNode)obj;
EngineDescriptor desc = node.getDescriptor();
removable = desc.isUserDefined();
}
getButton(DELETE_ID).setEnabled(removable);
}
private void doNew() {
NewEngineWizard wizard = new NewEngineWizard(descManager.getEngineTypes());
WizardDialog dialog = new WizardDialog(getShell(), wizard);
dialog.create();
dialog.getShell().setSize(400, 500);
if (dialog.open()==WizardDialog.OK) {
EngineTypeDescriptor etdesc = wizard.getSelectedEngineType();
EngineDescriptor desc = new EngineDescriptor(descManager);
desc.setEngineType(etdesc);
desc.setUserDefined(true);
desc.setId(descManager.computeNewId(etdesc.getId()));
ScopePreferenceManager mng = (ScopePreferenceManager)getPreferenceManager();
IPreferenceNode node = mng.addNode(desc);
getTreeViewer().refresh();
getTreeViewer().setSelection(new StructuredSelection(node));
scheduleOperation(NEW_ID, desc);
}
}
private void doDelete() {
Object obj = ((IStructuredSelection)getTreeViewer().getSelection()).getFirstElement();
if (obj instanceof ScopePreferenceManager.EnginePreferenceNode) {
ScopePreferenceManager.EnginePreferenceNode node = (ScopePreferenceManager.EnginePreferenceNode)obj;
EngineDescriptor desc = node.getDescriptor();
//ScopePreferenceManager mng = (ScopePreferenceManager)getPreferenceManager();
getTreeViewer().remove(node);
scheduleOperation(DELETE_ID, desc);
}
}
private void scheduleOperation(int action, EngineDescriptor desc) {
if (pendingOperations==null)
pendingOperations = new ArrayList<>();
pendingOperations.add(new PendingOperation(action, desc));
}
@Override
protected void okPressed() {
super.okPressed();
if (pendingOperations!=null) {
// process pending operations
for (int i=0; i<pendingOperations.size(); i++) {
PendingOperation op = pendingOperations.get(i);
if (op.action==NEW_ID)
descManager.add(op.desc);
else
descManager.remove(op.desc);
}
pendingOperations = null;
}
descManager.save();
}
}