/* * Copyright (C) 2012-2016 NS Solutions Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package com.htmlhifive.tools.jslint.dialog; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang.StringUtils; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.WritableValue; import org.eclipse.core.databinding.validation.MultiValidator; import org.eclipse.core.databinding.validation.ValidationStatus; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.jface.databinding.dialog.TitleAreaDialogSupport; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import com.htmlhifive.tools.jslint.messages.Messages; /** * 入力ダイアログ. * * @author NS Solutions Corporation * */ public class CreateOptionFileDialog extends TitleAreaDialog { /** * オプションファイル名. */ private WritableValue wvOptionFileName = new WritableValue("", String.class); /** * オプションファイル出力先ディレクトリ. */ private WritableValue wvOutpuDir = new WritableValue("", String.class); /** * オプションファイル名テキスト. */ private Text textOptionFileName; /** * タイトル. */ private String title; /** * 出力先ディレクトリテキスト. */ private Text textOutputDir; /** * * コンストラクタ. * * @param parentShell シェル. * @param title ダイアログのタイトル */ public CreateOptionFileDialog(Shell parentShell, String title) { super(parentShell); setShellStyle(SWT.DIALOG_TRIM | SWT.RESIZE | SWT.APPLICATION_MODAL); setHelpAvailable(false); this.title = title; } /* * (非 Javadoc) * * @see * org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets * .Shell) */ @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(title); } /* * (非 Javadoc) * * @see * org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse * .swt.widgets.Composite) */ @Override protected Control createDialogArea(Composite parent) { setTitle(Messages.DL0018.getText()); Composite area = (Composite) super.createDialogArea(parent); area.setLayout(new GridLayout(1, false)); Composite composite = new Composite(area, SWT.NONE); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); composite.setLayout(new GridLayout(2, false)); Label labelOutputDir = new Label(composite, SWT.NONE); labelOutputDir.setText(Messages.DL0020.getText()); Composite outputDircomp = new Composite(composite, SWT.NONE); outputDircomp.setLayout(new GridLayout(2, false)); outputDircomp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 1, 1)); textOutputDir = new Text(outputDircomp, SWT.BORDER); textOutputDir.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Button btnOutPut = new Button(outputDircomp, SWT.NONE); GridData gdBtnOutPut = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); gdBtnOutPut.widthHint = 60; btnOutPut.setLayoutData(gdBtnOutPut); btnOutPut.setText(Messages.B0001.getText()); btnOutPut.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { FolderSelectionDialog dialog = new FolderSelectionDialog(getShell(), Messages.DT0008.getText(), Messages.DL0022.getText()); if (dialog.open() != Window.OK) { return; } IContainer outputDir = (IContainer) dialog.getFirstResult(); textOutputDir.setText(outputDir.getFullPath().toString()); } }); Label labelOptionFileName = new Label(composite, SWT.NONE); labelOptionFileName.setText(Messages.DL0021.getText()); Composite inputComp = new Composite(composite, SWT.NONE); inputComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); inputComp.setLayout(new GridLayout(1, false)); textOptionFileName = new Text(inputComp, SWT.BORDER); textOptionFileName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); initializeDataBindings(); setMessage(Messages.DL0019.getText(), IMessageProvider.INFORMATION); return area; } /** * データバインドの初期化. */ private void initializeDataBindings() { DataBindingContext context = new DataBindingContext(); // validator MultiValidator validator = new MultiValidator() { @Override protected IStatus validate() { StringBuilder sb = new StringBuilder(); String optionFileName = (String) wvOptionFileName.getValue(); if (StringUtils.isEmpty(optionFileName)) { sb.append(Messages.EM0009.format(Messages.DL0021.getText())); } else if (!FilenameUtils.isExtension(optionFileName, "xml")) { optionFileName += ".xml"; } String outputDir = (String) wvOutpuDir.getValue(); if (StringUtils.isEmpty(outputDir)) { sb.append(Messages.EM0009.format(Messages.DL0020.getText())); } else { IPath path = new Path(outputDir); if (!ResourcesPlugin.getWorkspace().getRoot().exists(path)) { sb.append(Messages.EM0000.format(Messages.DL0020.getText())); } } if (StringUtils.isNotEmpty(optionFileName) && StringUtils.isNotEmpty(outputDir)) { IPath path = new Path(outputDir + "/" + optionFileName); if (ResourcesPlugin.getWorkspace().getRoot().exists(path)) { sb.append(Messages.EM0013.getText()); } } if (StringUtils.isEmpty(sb.toString())) { getButton(IDialogConstants.OK_ID).setEnabled(true); return ValidationStatus.info(Messages.DL0019.getText()); } if (getButton(IDialogConstants.OK_ID) != null) { getButton(IDialogConstants.OK_ID).setEnabled(false); } return ValidationStatus.error(sb.toString()); } }; // 出力ディレクトリ IObservableValue outputDir = SWTObservables.observeText(textOutputDir, SWT.Modify); context.bindValue(outputDir, wvOutpuDir, null, null); // ファイル名 IObservableValue optionFileName = SWTObservables.observeText(textOptionFileName, SWT.Modify); context.bindValue(optionFileName, wvOptionFileName, null, null); context.addValidationStatusProvider(validator); TitleAreaDialogSupport.create(this, context); } /* * (非 Javadoc) * * @see * org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse * .swt.widgets.Composite) */ @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true).setEnabled(false); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); } /* * (非 Javadoc) * * @see org.eclipse.jface.dialogs.TitleAreaDialog#getInitialSize() */ @Override protected Point getInitialSize() { return new Point(515, 279); } /** * 出力先ファイルパスを取得する. * * @return 出力先ファイルパス. */ public String getOutputFilePath() { String outputDir = (String) wvOutpuDir.getValue(); String optionFileName = (String) wvOptionFileName.getValue(); if (!FilenameUtils.isExtension(optionFileName, "xml")) { optionFileName += ".xml"; } return outputDir + "/" + optionFileName; } }