/******************************************************************************
* Copyright (C) 2006-2012 IFS Institute for Software 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
*
* Original authors:
* Dennis Hunziker
* Ueli Kistler
* Reto Schuettel
* Robin Stocker
* Contributors:
* Fabio Zadrozny <fabiofz@gmail.com> - initial implementation
******************************************************************************/
/*
* Copyright (C) 2006, 2007 Dennis Hunziker, Ueli Kistler
* Copyright (C) 2007 Reto Schuettel, Robin Stocker
*
* IFS Institute for Software, HSR Rapperswil, Switzerland
*
*/
package org.python.pydev.refactoring.ui.pages;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
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.ui.dialogs.ContainerCheckedTreeViewer;
import org.python.pydev.refactoring.ast.adapters.offsetstrategy.IOffsetStrategy;
import org.python.pydev.refactoring.codegenerator.constructorfield.ConstructorFieldRefactoring;
import org.python.pydev.refactoring.codegenerator.constructorfield.ConstructorFieldRequestProcessor;
import org.python.pydev.refactoring.core.model.OffsetStrategyModel;
import org.python.pydev.refactoring.core.model.OffsetStrategyProvider;
import org.python.pydev.refactoring.core.model.constructorfield.ClassFieldTreeProvider;
import org.python.pydev.refactoring.messages.Messages;
import org.python.pydev.refactoring.ui.core.TreeLabelProvider;
public class ConstructorFieldPage extends UserInputWizardPage {
public static final String PAGE_NAME = "ConstructorFieldPage"; //$NON-NLS-1$
private final OffsetStrategyProvider strategyProvider;
private Composite mainComp = null;
private Composite buttonComp = null;
private Button selectAll = null;
private Button deselectAll = null;
private CLabel cLabel = null;
private Composite treeComp = null;
private Composite comboComp = null;
private ComboViewer methodInsertionComb = null;
private CLabel methodInsertionLbl = null;
private ContainerCheckedTreeViewer treeViewer = null;
private ClassFieldTreeProvider classProvider;
private ILabelProvider labelProvider;
public ConstructorFieldPage(ClassFieldTreeProvider provider) {
super(PAGE_NAME);
this.classProvider = provider;
this.labelProvider = new TreeLabelProvider();
this.strategyProvider = new OffsetStrategyProvider(IOffsetStrategy.AFTERINIT | IOffsetStrategy.BEGIN
| IOffsetStrategy.END);
}
private Composite createMainComp(Composite parent) {
GridData gridData12 = new GridData();
gridData12.horizontalSpan = 2;
GridData gridData11 = new GridData();
gridData11.horizontalSpan = 2;
GridLayout gridLayout2 = new GridLayout();
gridLayout2.numColumns = 2;
GridData gridData = new GridData();
gridData.horizontalAlignment = GridData.FILL;
gridData.grabExcessHorizontalSpace = true;
gridData.grabExcessVerticalSpace = true;
gridData.verticalAlignment = GridData.FILL;
mainComp = new Composite(parent, SWT.NONE);
mainComp.setLayoutData(gridData);
cLabel = new CLabel(mainComp, SWT.NONE);
cLabel.setText(Messages.constructorFieldSelect);
cLabel.setLayoutData(gridData11);
createTreeComp();
createButtonComp();
mainComp.setLayout(gridLayout2);
createComboComp();
return mainComp;
}
private void createButtonComp() {
GridData gridData3 = new GridData();
gridData3.horizontalAlignment = GridData.CENTER;
gridData3.verticalAlignment = GridData.BEGINNING;
GridData gridData2 = new GridData();
gridData2.widthHint = 80;
GridData gridData1 = new GridData();
gridData1.widthHint = 80;
buttonComp = new Composite(mainComp, SWT.NONE);
buttonComp.setLayout(new GridLayout());
buttonComp.setLayoutData(gridData3);
selectAll = new Button(buttonComp, SWT.NONE);
selectAll.setText(Messages.wizardSelectAll);
selectAll.setLayoutData(gridData2);
selectAll.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
treeViewer.setAllChecked(true);
getRequestProcessor().setCheckedElements(treeViewer.getCheckedElements());
ConstructorFieldPage.this.getWizard().getContainer().updateButtons();
}
});
deselectAll = new Button(buttonComp, SWT.NONE);
deselectAll.setText(Messages.wizardDeselectAll);
deselectAll.setLayoutData(gridData1);
deselectAll.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
treeViewer.setAllChecked(false);
getRequestProcessor().setCheckedElements(treeViewer.getCheckedElements());
ConstructorFieldPage.this.getWizard().getContainer().updateButtons();
}
});
}
private void createTreeComp() {
GridData gridData5 = new GridData();
gridData5.horizontalAlignment = GridData.FILL;
gridData5.grabExcessHorizontalSpace = true;
gridData5.grabExcessVerticalSpace = true;
gridData5.verticalAlignment = GridData.FILL;
treeComp = new Composite(mainComp, SWT.NONE);
treeComp.setLayout(new FillLayout());
treeComp.setLayoutData(gridData5);
createTreeViewer(treeComp);
}
private void createComboComp() {
FillLayout fillLayout = new FillLayout();
fillLayout.type = org.eclipse.swt.SWT.VERTICAL;
GridData gridData7 = new GridData();
gridData7.horizontalSpan = 2;
gridData7.verticalAlignment = GridData.CENTER;
gridData7.grabExcessHorizontalSpace = true;
gridData7.horizontalAlignment = GridData.FILL;
comboComp = new Composite(mainComp, SWT.NONE);
comboComp.setLayoutData(gridData7);
comboComp.setLayout(fillLayout);
methodInsertionLbl = new CLabel(comboComp, SWT.NONE);
methodInsertionLbl.setText(Messages.offsetStrategyInsertionPointMethod);
methodInsertionComb = createComboViewer(comboComp);
methodInsertionComb.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
IStructuredSelection sel = (IStructuredSelection) event.getSelection();
if (!sel.isEmpty()) {
OffsetStrategyModel elem = (OffsetStrategyModel) sel.getFirstElement();
getRequestProcessor().setMethodDestination(elem.getStrategy());
}
}
});
getRequestProcessor().setMethodDestination(strategyProvider.get(0).getStrategy());
methodInsertionComb.getCombo().select(0);
}
private void createTreeViewer(Composite treeComp) {
treeViewer = new ContainerCheckedTreeViewer(treeComp);
treeViewer.addCheckStateListener(new ICheckStateListener() {
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
getRequestProcessor().setCheckedElements(treeViewer.getCheckedElements());
ConstructorFieldPage.this.getWizard().getContainer().updateButtons();
}
});
treeViewer.setContentProvider(classProvider);
treeViewer.setLabelProvider(labelProvider);
treeViewer.setAutoExpandLevel(2);
treeViewer.setInput("");
treeViewer.setSelection(new StructuredSelection(treeViewer.getExpandedElements()[0]));
}
@Override
public void createControl(Composite composite) {
Composite main = createMainComp(composite);
main.pack();
this.setControl(main);
}
private ComboViewer createComboViewer(Composite comboComp) {
ComboViewer v = new ComboViewer(comboComp);
v.setContentProvider(this.strategyProvider);
v.setLabelProvider(new LabelProvider());
v.setInput("");
return v;
}
private ConstructorFieldRequestProcessor getRequestProcessor() {
return getConstructorFieldRefactoring().getRequestProcesor();
}
public ConstructorFieldRefactoring getConstructorFieldRefactoring() {
return (ConstructorFieldRefactoring) getRefactoring();
}
@Override
public boolean canFlipToNextPage() {
return (treeViewer.getCheckedElements().length > 0);
}
}