blob: c34fc86602ed67165111b3a0358a1f8ad63b6479 [file] [log] [blame]
package org.eclipse.wst.server.ui.internal;
/**********************************************************************
* Copyright (c) 2003 IBM Corporation and others.
* All rights reserved.   This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
 *
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.*;
import org.eclipse.wst.server.core.*;
import org.eclipse.wst.server.core.util.TaskModel;
import org.eclipse.wst.server.ui.ServerUICore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
/**
*
*/
public class ModuleRepairDialog extends Dialog {
private static final String ROOT = "root";
protected static final Object[] EMPTY = new Object[0];
//protected List fixes;
protected IServerLifecycleEvent[] events;
protected List checkedList = new ArrayList();
protected Map childMap = new HashMap();
public class TaskInfo {
ITask task;
IServerLifecycleEvent parent;
//boolean checked = true;
}
protected CheckboxTreeViewer viewer;
// content and label provider for repair dialog
public class RepairContentProvider implements ITreeContentProvider {
public void dispose() { }
public Object getParent(Object element) {
if (element instanceof IServerLifecycleEvent)
return ROOT;
else if (element instanceof TaskInfo)
return ((TaskInfo) element).parent;
else
return null;
}
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
public Object[] getChildren(Object element) {
if (ROOT.equals(element)) {
return events;
} else if (element instanceof IServerLifecycleEvent) {
IServerLifecycleEvent mse = (IServerLifecycleEvent) element;
Object children = childMap.get(mse);
if (children == null) {
ITask[] tasks = mse.getTasks();
int size = tasks.length;
TaskInfo[] ti = new TaskInfo[size];
for (int i = 0; i < size; i++) {
ti[i] = new TaskInfo();
ti[i].task = tasks[i];
ti[i].parent = mse;
ITaskModel taskModel = new TaskModel();
taskModel.putObject(ITaskModel.TASK_SERVER, mse.getServer());
IServerConfiguration config = mse.getServer().getServerConfiguration();
if (config != null)
taskModel.putObject(ITaskModel.TASK_SERVER_CONFIGURATION, config);
tasks[i].setTaskModel(taskModel);
}
children = ti;
childMap.put(mse, children);
}
return (Object[]) children;
}
return EMPTY;
}
public Object[] getElements(Object element) {
return getChildren(element);
}
public void inputChanged(Viewer newViewer, Object oldInput, Object newInput) { }
}
public class RepairLabelProvider implements ILabelProvider {
public void addListener(ILabelProviderListener listener) { }
public void removeListener(ILabelProviderListener listener) { }
public Image getImage(Object element) {
if (element instanceof IServerLifecycleEvent) {
return ServerUICore.getLabelProvider().getImage(((IServerLifecycleEvent) element).getServer());
} else if (element instanceof TaskInfo) {
return ImageResource.getImage(ImageResource.IMG_REPAIR_CONFIGURATION);
} else
return null;
}
public String getText(Object element) {
if (element instanceof IServerLifecycleEvent) {
return ServerUICore.getLabelProvider().getText(((IServerLifecycleEvent) element).getServer());
} else if (element instanceof TaskInfo) {
return ((TaskInfo) element).task.getDescription();
}
return "";
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void dispose() { }
}
public ModuleRepairDialog(Shell parent, IServerLifecycleEvent[] events) {
super(parent);
setShellStyle(SWT.BORDER | SWT.TITLE | SWT.APPLICATION_MODAL); // no close button
setBlockOnOpen(true);
this.events = events;
}
/* (non-Javadoc)
* Method declared in Window.
*/
protected void configureShell(Shell shell) {
super.configureShell(shell);
shell.setText(ServerUIPlugin.getResource("%dialogRepairConfigurationTitle"));
}
protected Control createDialogArea(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
composite.setLayout(layout);
GridData data = new GridData(GridData.FILL_BOTH);
composite.setLayoutData(data);
composite.setFont(parent.getFont());
Label label = new Label(composite, SWT.WRAP);
label.setText(ServerUIPlugin.getResource("%dialogRepairConfigurationMessage"));
data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
label.setLayoutData(data);
Tree tree = new Tree(composite, SWT.BORDER | SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL);
data = new GridData(GridData.FILL_HORIZONTAL);
data.heightHint = 140;
data.widthHint = 400;
tree.setLayoutData(data);
viewer = new CheckboxTreeViewer(tree);
viewer.setLabelProvider(new RepairLabelProvider());
viewer.setContentProvider(new RepairContentProvider());
viewer.setInput(ROOT);
viewer.addCheckStateListener(new ICheckStateListener() {
public void checkStateChanged(CheckStateChangedEvent event) {
checked(event.getElement(), event.getChecked());
viewer.refresh();
}
});
viewer.setSorter(new ViewerSorter() { });
viewer.expandToLevel(4);
int size = events.length;
for (int i = 0; i < size; i++) {
viewer.setSubtreeChecked(events[i], true);
checked(events[i], true);
}
Dialog.applyDialogFont(composite);
return composite;
}
protected void addRemove(Object obj, boolean add) {
if (add) {
if (!checkedList.contains(obj))
checkedList.add(obj);
} else {
if (checkedList.contains(obj))
checkedList.remove(obj);
}
}
protected void checked(Object element, boolean checked) {
if (element instanceof IServerLifecycleEvent) {
addRemove(element, checked);
viewer.setSubtreeChecked(element, checked);
try {
RepairContentProvider rcp = (RepairContentProvider) viewer.getContentProvider();
Object[] children = rcp.getChildren(element);
int size = children.length;
for (int i = 0; i < size; i++)
addRemove(((TaskInfo)children[i]).task, checked);
} catch (Exception e) {
// do nothing
}
} else if (element instanceof TaskInfo) {
TaskInfo ti = (TaskInfo) element;
addRemove(ti.task, checked);
IServerLifecycleEvent mse = ti.parent;
if (!checked) { // && anyChildren(info, !checked)) {
addRemove(mse, checked);
viewer.setChecked(mse, checked);
} else if (checked && allChildren(mse, checked)) {
addRemove(mse, checked);
viewer.setChecked(mse, checked);
}
}
}
protected boolean allChildren(IServerLifecycleEvent mse, boolean b) {
ITask[] tasks = mse.getTasks();
if (tasks == null)
return false;
int size = tasks.length;
for (int i = 0; i < size; i++) {
if (b != checkedList.contains(tasks[i]))
return false;
}
return true;
}
protected void okPressed() {
super.okPressed();
// perform commands
int size = events.length;
List list = new ArrayList();
for (int i = 0; i < size; i++) {
IServerLifecycleEvent mse = events[i];
if (checkedList.contains(mse)) {
IServer server = mse.getServer();
if (EclipseUtil.validateEdit(getShell(), server)) {
IServerWorkingCopy serverWC = server.getWorkingCopy();
IServerConfigurationWorkingCopy configWC = null;
if (server.getServerConfiguration() != null)
configWC = server.getServerConfiguration().getWorkingCopy();
ITaskModel taskModel = new TaskModel();
taskModel.putObject(ITaskModel.TASK_SERVER, serverWC);
if (configWC != null)
taskModel.putObject(ITaskModel.TASK_SERVER_CONFIGURATION, configWC);
try {
//IServerConfiguration config = info.configuration;
//IProgressMonitor monitor = new NullProgressMonitor();
//IResource resource = ServerCore.getResourceManager().getServerResourceLocation(serverResource);
//resource.refreshLocal(IResource.DEPTH_INFINITE, monitor);
} catch (Exception e) { }
ITask[] tasks = mse.getTasks();
int size2 = tasks.length;
for (int j = 0; j < size2; j++) {
if (checkedList.contains(tasks[j])) {
try {
tasks[j].setTaskModel(taskModel);
tasks[j].execute(new NullProgressMonitor());
} catch (CoreException ce) {
Trace.trace(Trace.SEVERE, "Error executing repair task", ce);
}
}
}
try {
serverWC.save(new NullProgressMonitor());
if (configWC != null)
configWC.save(new NullProgressMonitor());
} catch (Exception e) { }
if (!list.contains(server) && server.isWorkingCopiesExist())
list.add(server);
}
}
}
// TODO reload affected editors
/*size = list.size();
for (int i = 0; i < size; i++) {
IServerConfiguration config = (IServerConfiguration) list.get(i);
GlobalCommandManager.getInstance().reload(config.getId(), new NullProgressMonitor());
GlobalCommandManager.getInstance().resourceSaved(config.getId());
GlobalCommandManager.getInstance().updateTimestamps(config.getId());
}*/
}
}