/*******************************************************************************
* Copyright (c) 2014, 2015 Cisco Systems, 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
*
*******************************************************************************/
package com.cisco.yangide.ext.refactoring.ui;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.window.Window;
import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import com.cisco.yangide.core.dom.Module;
import com.cisco.yangide.core.dom.QName;
import com.cisco.yangide.core.indexing.ElementIndexReferenceInfo;
import com.cisco.yangide.core.indexing.ElementIndexReferenceType;
import com.cisco.yangide.core.model.YangModelManager;
import com.cisco.yangide.ext.refactoring.code.ChangeRevisionRefactoring;
import com.cisco.yangide.ext.refactoring.nls.Messages;
import com.cisco.yangide.ui.internal.IYangUIConstants;
import com.cisco.yangide.ui.internal.YangUIImages;
/**
* @author Konstantin Zaitsev
* @date Aug 18, 2014
*/
public class ChangeRevisionInputWizardPage extends UserInputWizardPage {
private Text revisionTxt;
private Text descriptionTxt;
private Button newFileCheck;
private TableViewer table;
private IFile[] files;
public ChangeRevisionInputWizardPage() {
super("RevisionInputPage"); //$NON-NLS-1$
setDescription(Messages.ChangeRevisionInputWizardPage_description);
}
@Override
public void createControl(Composite parent) {
Composite content = new Composite(parent, SWT.NONE);
GridLayoutFactory.swtDefaults().numColumns(3).spacing(0, 5).applyTo(content);
new Label(content, SWT.NONE).setText(Messages.ChangeRevisionInputWizardPage_revisionLabel);
revisionTxt = new Text(content, SWT.BORDER);
revisionTxt.setEditable(false);
Button revisionBtn = new Button(content, SWT.FLAT | SWT.PUSH);
GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.TOP).hint(24, 24).applyTo(revisionBtn);
revisionBtn.setImage(RefactoringImages.getImage(RefactoringImages.IMG_CALENDAR));
revisionBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
RevisionDialog dialog = new RevisionDialog(getShell());
try {
dialog.setRevision(revisionTxt.getText());
} catch (ParseException ex) {
setErrorMessage(ex.getMessage());
setPageComplete(false);
}
if (dialog.open() == Window.OK) {
revisionTxt.setText(dialog.getRevision());
setState();
}
}
});
new Label(content, SWT.NONE).setText(Messages.ChangeRevisionInputWizardPage_descriptionLabel);
descriptionTxt = new Text(content, SWT.BORDER | SWT.MULTI);
GridDataFactory.fillDefaults().span(4, 1).align(SWT.FILL, SWT.TOP).grab(true, false).hint(SWT.DEFAULT, 50)
.applyTo(descriptionTxt);
descriptionTxt.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
setState();
}
});
newFileCheck = new Button(content, SWT.CHECK);
GridDataFactory.fillDefaults().span(3, 1).align(SWT.FILL, SWT.TOP).applyTo(newFileCheck);
newFileCheck.setText(Messages.ChangeRevisionInputWizardPage_newFileCheckLabel);
newFileCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setState();
}
});
Label tableLabel = new Label(content, SWT.NONE);
tableLabel.setText(Messages.ChangeRevisionInputWizardPage_refGroupLabel);
GridDataFactory.fillDefaults().span(3, 1).align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(tableLabel);
Composite group = new Composite(content, SWT.NONE);
GridLayoutFactory.swtDefaults().margins(0, 0).numColumns(2).applyTo(group);
GridDataFactory.fillDefaults().span(3, 1).grab(true, true).align(SWT.FILL, SWT.TOP).applyTo(group);
table = new TableViewer(group, SWT.CHECK | SWT.BORDER);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, true).hint(SWT.DEFAULT, 200)
.applyTo(table.getControl());
table.setContentProvider(ArrayContentProvider.getInstance());
table.getTable().setHeaderVisible(true);
table.getTable().setLinesVisible(true);
TableViewerColumn viewerColumn = new TableViewerColumn(table, SWT.NONE);
TableColumn column = viewerColumn.getColumn();
column.setText(Messages.ChangeRevisionInputWizardPage_refTableName);
column.setWidth(250);
column.setResizable(true);
viewerColumn.setLabelProvider(new ColumnLabelProvider() {
@Override
public Image getImage(Object element) {
return YangUIImages.getImage(IYangUIConstants.IMG_YANG_FILE);
}
@Override
public String getText(Object element) {
IFile file = (IFile) element;
return file.getName();
}
});
viewerColumn = new TableViewerColumn(table, SWT.NONE);
column = viewerColumn.getColumn();
column.setText(Messages.ChangeRevisionInputWizardPage_refTablePath);
column.setWidth(300);
column.setResizable(true);
viewerColumn.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
IFile file = (IFile) element;
return file.getProjectRelativePath().toString();
}
});
viewerColumn = new TableViewerColumn(table, SWT.NONE);
column = viewerColumn.getColumn();
column.setText(Messages.ChangeRevisionInputWizardPage_refTableProject);
column.setWidth(200);
column.setResizable(true);
viewerColumn.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
IFile file = (IFile) element;
return file.getProject().getName();
}
});
Composite controls = new Composite(group, SWT.NONE);
GridLayoutFactory.swtDefaults().margins(0, 0).applyTo(controls);
GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.TOP).applyTo(controls);
Button tableSelectAllBtn = new Button(controls, SWT.PUSH);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).applyTo(tableSelectAllBtn);
tableSelectAllBtn.setText(Messages.ChangeRevisionInputWizardPage_refTableSellectAllBtn);
tableSelectAllBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
for (int i = 0; i < table.getTable().getItemCount(); i++) {
table.getTable().getItem(i).setChecked(true);
}
setState();
}
});
Button tableDeselectAllBtn = new Button(controls, SWT.PUSH);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).applyTo(tableDeselectAllBtn);
tableDeselectAllBtn.setText(Messages.ChangeRevisionInputWizardPage_refTableDeselectAllBtn);
tableDeselectAllBtn.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
for (int i = 0; i < table.getTable().getItemCount(); i++) {
table.getTable().getItem(i).setChecked(false);
}
setState();
}
});
table.getTable().addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
setState();
}
});
Dialog.applyDialogFont(content);
setControl(content);
}
@Override
public void setVisible(boolean visible) {
if (visible) {
loadState();
}
super.setVisible(visible);
}
private void setState() {
ChangeRevisionRefactoring refactoring = (ChangeRevisionRefactoring) getRefactoring();
refactoring.setCreateNewFile(newFileCheck.getSelection());
refactoring.setRevision(revisionTxt.getText());
refactoring.setDescription(descriptionTxt.getText());
List<IPath> refs = new ArrayList<>();
for (int i = 0; i < table.getTable().getItemCount(); i++) {
if (table.getTable().getItem(i).getChecked()) {
refs.add(files[i].getFullPath());
}
}
refactoring.setReferences(refs);
}
private void loadState() {
ChangeRevisionRefactoring refactoring = (ChangeRevisionRefactoring) getRefactoring();
Module module = refactoring.getModule();
if (refactoring.getRevision() == null) {
refactoring.setRevision(RevisionDialog.DF.format(new Date()));
}
revisionTxt.setText(refactoring.getRevision());
descriptionTxt.setText(refactoring.getDescription() != null ? refactoring.getDescription() : ""); //$NON-NLS-1$
newFileCheck.setSelection(refactoring.isCreateNewFile());
QName name = new QName(module.getName(), null, module.getName(), module.getRevision());
ElementIndexReferenceInfo[] reference = YangModelManager.getIndexManager().searchReference(name,
ElementIndexReferenceType.IMPORT, null);
files = new IFile[reference.length];
for (int i = 0; i < reference.length; i++) {
files[i] = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(reference[i].getPath()));
}
table.setInput(files);
for (int i = 0; i < files.length; i++) {
table.getTable().getItem(i).setChecked(refactoring.getReferences().contains(files[i].getFullPath()));
}
}
}