/** * */ package org.jboss.tools.smooks.configuration.editors.xml; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.emf.common.ui.dialogs.WorkspaceResourceDialog; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.jboss.tools.smooks.configuration.editors.IFilePathProcessor; import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils; /** * * @author Dart Peng Date : 2008-8-13 */ public abstract class AbstractFileSelectionWizardPage extends WizardPage implements SelectionListener { protected IStructuredSelection selection; protected Object returnObject = null; protected Text fileText; protected Composite fileTextComposite; protected CheckboxTableViewer tableViewer = null; protected Button fileSystemBrowseButton; protected boolean reasourceLoaded = false; protected Button workspaceBrowseButton; private String filePath = null; protected Object[] initSelections; protected List<ViewerFilter> filters = new ArrayList<ViewerFilter>(); protected boolean multiSelect = false; private IFilePathProcessor filePathProcessor = null; protected String[] fileExtensionNames; public AbstractFileSelectionWizardPage(String pageName, boolean multiSelect, Object[] initSelections, List<ViewerFilter> filters,String[] fileExtensionNames) { this(pageName, false, initSelections, Collections.EMPTY_LIST); this.fileExtensionNames = fileExtensionNames; createFileExtensionNameFilter(); } /** * @return the fileExtensionNames */ public String[] getFileExtensionNames() { return fileExtensionNames; } /** * @param fileExtensionNames the fileExtensionNames to set */ public void setFileExtensionNames(String[] fileExtensionNames) { this.fileExtensionNames = fileExtensionNames; } public void createFileExtensionNameFilter(){ if (this.fileExtensionNames != null && this.fileExtensionNames.length != 0) { ViewerFilter extensionNameFilter = new ViewerFilter() { /* * (non-Javadoc) * * @see * org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse * .jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ @Override public boolean select(Viewer viewer, Object parentElement, Object element) { if (element instanceof IFile && AbstractFileSelectionWizardPage.this.fileExtensionNames != null) { String extName = ((IFile) element).getFileExtension(); for (int i = 0; i < AbstractFileSelectionWizardPage.this.fileExtensionNames.length; i++) { String name = AbstractFileSelectionWizardPage.this.fileExtensionNames[i]; if (name.equalsIgnoreCase(extName)) { return true; } } return false; } return true; } }; this.filters.add(extensionNameFilter); } } public AbstractFileSelectionWizardPage(String pageName, boolean multiSelect, Object[] initSelections, List<ViewerFilter> filters) { super(pageName); this.initSelections = initSelections; if (filters != null) { this.filters.addAll(filters); } this.multiSelect = multiSelect; } public AbstractFileSelectionWizardPage(String pageName, String[] fileExtensionNames) { this(pageName, false, null, Collections.EMPTY_LIST); this.fileExtensionNames = fileExtensionNames; createFileExtensionNameFilter(); } public Object getReturnValue() { try { String path = getFilePath(); if (path == null) return null; path = SmooksUIUtils.parseFilePath(path); returnObject = this.loadedTheObject(path); } catch (Exception e) { SmooksUIUtils.showErrorDialog(getShell(), SmooksUIUtils.createErrorStatus(e)); } return returnObject; } public String getFilePath() { return filePath; } public IFilePathProcessor getFilePathProcessor() { return filePathProcessor; } public void setFilePathProcessor(IFilePathProcessor filePathProcessor) { this.filePathProcessor = filePathProcessor; } /* * (non-Javadoc) * * @see * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets * .Composite) */ public void createControl(Composite parent) { Composite mainComposite = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.numColumns = 1; mainComposite.setLayout(layout); GridData gd = new GridData(GridData.FILL_BOTH); gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; mainComposite.setLayoutData(gd); // xmlButton = new Button(mainComposite, SWT.RADIO); // xmlButton.setText("Select a XML file"); // // Composite xmlComposite = this // .createXMLFileSelectionComposite(mainComposite); // // Label sp = new Label(mainComposite, SWT.HORIZONTAL | SWT.SEPARATOR); // gd = new GridData(GridData.FILL_HORIZONTAL); // sp.setLayoutData(gd); // // xsdButton = new Button(mainComposite, SWT.RADIO); // xsdButton.setText("Select a XSD file"); createFileSelectionComposite(mainComposite); // init the panel status (XSD file selection composite is disabled) // xsdButton.setSelection(true); // // setCompositeChildrenEnabled(xmlComposite, false); // registe the listener for controls hookBrowseButtonSelectionAdapter(); hookFileTextModifyListener(); this.setControl(mainComposite); changeWizardPageStatus(); // don't show the error message when first open the dialog this.setErrorMessage(null); parent.getShell().setText(Messages.AbstractFileSelectionWizardPage_WizardTitle); } protected void hookFileTextModifyListener() { final ModifyListener modifyListener = new ModifyListener() { public void modifyText(ModifyEvent e) { filePath = fileText.getText(); changeWizardPageStatus(); } }; // xmlFileText.addModifyListener(modifyListener); fileText.addModifyListener(modifyListener); } protected void hookRadioButtonSelectionAdapter() { // xsdButton.addSelectionListener(this); } protected void hookBrowseButtonSelectionAdapter() { SelectionAdapter browseButtonSelectionAdapter = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { Text relationT = null; if (e.getSource() == fileSystemBrowseButton) { relationT = fileText; } openFileSelection(relationT); } }; SelectionAdapter wbrowseButtonSelectionAdapter = new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { Text relationT = null; if (e.getSource() == workspaceBrowseButton) { relationT = fileText; } openWorkSpaceSelection(relationT); } }; workspaceBrowseButton.addSelectionListener(wbrowseButtonSelectionAdapter); // xmlFileSystemBrowseButton // .addSelectionListener(browseButtonSelectionAdapter); fileSystemBrowseButton.addSelectionListener(browseButtonSelectionAdapter); } protected void openWorkSpaceSelection(Text relationT) { IFile[] files = WorkspaceResourceDialog.openFileSelection(getShell(), "Select Files", "", false, initSelections, filters); //$NON-NLS-1$ //$NON-NLS-2$ // dialog.setInitialSelections(selectedResources); if (files.length > 0) { IFile file = files[0]; String s = processWorkSpaceFilePath(file); relationT.setText(s); } } protected String processFileSystemFilePath(String path) { if (filePathProcessor != null) { String s = filePathProcessor.processFileSystemPath(path); if (s != null) { return s; } } path = SmooksUIUtils.FILE_PRIX + path; return path; } protected String processWorkSpaceFilePath(IFile file) { if (filePathProcessor != null) { String s = filePathProcessor.processWorkBenchPath(file); if (s != null) { return s; } } String s = file.getFullPath().toPortableString(); s = SmooksUIUtils.WORKSPACE_PRIX + s; return s; } protected Text createFilePathText(Composite parent) { fileTextComposite = new Composite(parent, SWT.NONE); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.grabExcessHorizontalSpace = true; fileTextComposite.setLayoutData(gd); GridLayout xsdtgl = new GridLayout(); xsdtgl.marginWidth = 0; xsdtgl.marginHeight = 0; xsdtgl.numColumns = 1; fileTextComposite.setLayout(xsdtgl); Text fileText = new Text(fileTextComposite, SWT.BORDER); gd = new GridData(GridData.FILL_HORIZONTAL); fileText.setLayoutData(gd); gd.grabExcessHorizontalSpace = true; return fileText; } protected Composite createFileSelectionComposite(Composite parent) { Composite xsdComposite = new Composite(parent, SWT.NONE); GridData gd = new GridData(GridData.FILL_HORIZONTAL); xsdComposite.setLayoutData(gd); GridLayout xsdLayout = new GridLayout(); xsdLayout.numColumns = 2; xsdLayout.marginWidth = 0; xsdComposite.setLayout(xsdLayout); createExtensionGUIFirst(xsdComposite); Label nfileLanel = new Label(xsdComposite, SWT.NONE); nfileLanel.setText("File : "); //$NON-NLS-1$ // fileTextComposite = new Composite(xsdComposite, SWT.NONE); // gd = new GridData(GridData.FILL_HORIZONTAL); // gd.grabExcessHorizontalSpace = true; // fileTextComposite.setLayoutData(gd); // GridLayout xsdtgl = new GridLayout(); // xsdtgl.marginWidth = 0; // xsdtgl.marginHeight = 0; // xsdtgl.numColumns = 1; // fileTextComposite.setLayout(xsdtgl); // // fileText = new Text(fileTextComposite, SWT.BORDER); // gd = new GridData(GridData.FILL_HORIZONTAL); // fileText.setLayoutData(gd); // gd.grabExcessHorizontalSpace = true; fileText = createFilePathText(xsdComposite); // final Button loadXSDButton = new Button(fileTextComposite, SWT.NONE); // loadXSDButton.setText("Load"); // loadXSDButton.addSelectionListener(new SelectionAdapter() { // // @Override // public void widgetSelected(SelectionEvent e) { // super.widgetSelected(e); // reasourceLoaded = false; // try { // returnObject = loadedTheObject(fileText.getText()); // reasourceLoaded = true; // } catch (Throwable e2) { // // ignore // e2.printStackTrace(); // } // changeWizardPageStatus(); // } // // }); Composite browseButtonComposite = new Composite(xsdComposite, SWT.NONE); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 2; browseButtonComposite.setLayoutData(gd); GridLayout bg = new GridLayout(); bg.numColumns = 2; bg.marginHeight = 0; bg.marginWidth = 0; bg.makeColumnsEqualWidth = false; browseButtonComposite.setLayout(bg); fileSystemBrowseButton = new Button(browseButtonComposite, SWT.NONE); fileSystemBrowseButton.setText("Browse File System"); //$NON-NLS-1$ workspaceBrowseButton = new Button(browseButtonComposite, SWT.NONE); workspaceBrowseButton.setText("Browse WorkSpace"); //$NON-NLS-1$ gd = new GridData(); gd.horizontalAlignment = GridData.END; workspaceBrowseButton.setLayoutData(gd); gd = new GridData(); gd.grabExcessHorizontalSpace = true; gd.horizontalAlignment = GridData.END; fileSystemBrowseButton.setLayoutData(gd); return xsdComposite; } protected void createExtensionGUIFirst(Composite parent) { // do nothing } abstract protected Object loadedTheObject(String path) throws Exception; protected void initTableViewer() { // tableViewer.addCheckStateListener(new ICheckStateListener() { // boolean flag = true; // // public void checkStateChanged(CheckStateChangedEvent event) { // if (flag) { // Object checkObject = event.getElement(); // boolean check = event.getChecked(); // flag = false; // tableViewer.setAllChecked(false); // tableViewer.setChecked(checkObject, check); // flag = true; // changeWizardPageStatus(); // } // } // }); // tableViewer.setContentProvider(new // XSDStructuredModelContentProvider()); // tableViewer.setLabelProvider(new XSDStructuredModelLabelProvider()); } protected void setCompositeChildrenEnabled(Composite composite, boolean enabled) { Control[] children = composite.getChildren(); for (int i = 0; i < children.length; i++) { Control child = children[i]; if (child instanceof Text) { child.setEnabled(enabled); } if (child instanceof Button) { child.setEnabled(enabled); } if (child instanceof Composite) { setCompositeChildrenEnabled((Composite) child, enabled); } } } protected void openFileSelection(Text relationText) { FileDialog dialog = new FileDialog(this.getShell()); if (fileExtensionNames != null) { String s = ""; //$NON-NLS-1$ for (int i = 0; i < fileExtensionNames.length; i++) { String exname = fileExtensionNames[i]; s += "*." + exname + ";"; //$NON-NLS-1$ //$NON-NLS-2$ } if (s.length() != 0) { s = s.substring(0, s.length() - 1); dialog.setFilterExtensions(new String[]{s,"*.*"}); //$NON-NLS-1$ } } String path = dialog.open(); if (path != null) { path = processFileSystemFilePath(path); relationText.setText(path); } } protected void changeWizardPageStatus() { String text = this.fileText.getText(); String error = null; if (text == null || "".equals(text)) //$NON-NLS-1$ error = "File name cannot be null"; //$NON-NLS-1$ // File tempFile = new File(text); // if(!tempFile.exists()){ // error = "Can't find the file , please select another one."; // } // if (!reasourceLoaded) { // error = "Resource must be loaded"; // } this.setErrorMessage(error); this.setPageComplete(error == null); } public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } public void widgetSelected(SelectionEvent e) { changeWizardPageStatus(); } public CheckboxTableViewer getTableViewer() { return tableViewer; } public void setTableViewer(CheckboxTableViewer tableViewer) { this.tableViewer = tableViewer; } public IStructuredSelection getSelection() { return selection; } public void setSelection(IStructuredSelection selection) { this.selection = selection; } public Object[] getInitSelections() { return initSelections; } public void setInitSelections(Object[] initSelections) { this.initSelections = initSelections; } public List<ViewerFilter> getFilters() { return filters; } public void setFilters(List<ViewerFilter> filters) { this.filters = filters; } public boolean isMultiSelect() { return multiSelect; } public void setMultiSelect(boolean multiSelect) { this.multiSelect = multiSelect; } }