/* * 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.view; import java.util.ArrayList; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.TabFolder; import org.eclipse.swt.widgets.TabItem; import org.eclipse.ui.dialogs.PropertyPage; import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer; import org.eclipse.wst.jsdt.core.JavaScriptCore; import com.htmlhifive.tools.jslint.configure.ConfigBean; import com.htmlhifive.tools.jslint.configure.JSLintConfigManager; import com.htmlhifive.tools.jslint.event.ConfigBeanChangeEvent; import com.htmlhifive.tools.jslint.event.ConfigBeanChangeListener; import com.htmlhifive.tools.jslint.logger.JSLintPluginLogger; import com.htmlhifive.tools.jslint.logger.JSLintPluginLoggerFactory; import com.htmlhifive.tools.jslint.messages.Messages; import com.htmlhifive.tools.jslint.parse.JsParserFactory; import com.htmlhifive.tools.jslint.parse.Parser; import com.htmlhifive.tools.jslint.parse.ParserManager; import com.htmlhifive.tools.jslint.util.CheckJavaScriptUtils; import com.htmlhifive.tools.jslint.util.ConfigBeanUtil; /** * Jslint設定ページ. * * @author NS Solutions Corporation * */ public class JslintPropertyPage extends PropertyPage { /** * ロガー. */ private static JSLintPluginLogger logger = JSLintPluginLoggerFactory.getLogger(JslintPropertyPage.class); /** * 選択プロジェクト. */ private IProject project; /** * 設定ページコンポジット. */ private JslintPropertyComposite propertyComp; /** * タブフォルダー. */ private TabFolder tabFolder; /** * 構成コンポジット. */ private TargetStructureComposite structureComposite; /** * コンストラクタ. */ public JslintPropertyPage() { super(); } /* * (非 Javadoc) * * @see * org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse * .swt.widgets.Composite) */ @Override protected Control createContents(Composite parent) { // JSLint設定のロード. project = (IProject) getElement().getAdapter(IProject.class); JSLintConfigManager.loadConfig(project); tabFolder = new TabFolder(parent, SWT.TOP); propertyComp = new JslintPropertyComposite(tabFolder, project); TabItem tabItem = new TabItem(tabFolder, SWT.NONE); tabFolder.setLayoutData(GridDataFactory.fillDefaults().create()); tabItem.setText(Messages.TT0000.getText()); tabItem.setControl(propertyComp); noDefaultAndApplyButton(); GridLayout layout = new GridLayout(); propertyComp.setLayout(layout); GridData data = new GridData(GridData.FILL); data.horizontalAlignment = GridData.FILL; data.grabExcessHorizontalSpace = true; propertyComp.setLayoutData(data); propertyComp.addConfigBeanChangeListener(new ConfigBeanChangeListener() { @Override public void modified(ConfigBeanChangeEvent event) { initCheck(); String[] errorMessages = ConfigBeanUtil.checkProperty(event.getChangedBean()); if (errorMessages.length > 0) { setErrorMessage(buildMessage(errorMessages)); } } }); // 構成ページ final TabItem targetStracture = new TabItem(tabFolder, SWT.NONE); targetStracture.setText(Messages.TT0001.getText()); structureComposite = new TargetStructureComposite(tabFolder, JavaScriptCore.create(project), (IWorkbenchPreferenceContainer) getContainer()); structureComposite.setLayoutData(GridDataFactory.fillDefaults().create()); targetStracture.setControl(structureComposite); tabFolder.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (e.item == targetStracture) { ((TargetStructureComposite) targetStracture.getControl()).refreshViewer(); } } }); return tabFolder; } @Override public boolean okToLeave() { tabFolder.setSelection(0); return super.okToLeave(); } /* * (非 Javadoc) * * @see org.eclipse.jface.preference.PreferencePage#performDefaults() */ @Override protected void performDefaults() { super.performDefaults(); propertyComp.setupVariable(JSLintConfigManager.getDefaultConfigBean(project)); } /* * (非 Javadoc) * * @see org.eclipse.jface.preference.PreferencePage#performOk() */ @Override public boolean performOk() { ConfigBean bean = JSLintConfigManager.getConfigBean(project); // 保存ビーンに画面の保存情報を追加する. Set<String> checkedExternalLibElems = structureComposite.getModel().getCheckedExternalLibElement(); Set<String> checkedInternalLibElems = structureComposite.getModel().getCheckedInternalLibElement(); List<String> externalLibPathList = new ArrayList<String>(); for (String wv : checkedExternalLibElems) { externalLibPathList.add(wv); } bean.setExternalLibPathList(externalLibPathList); List<String> internalLibPathList = new ArrayList<String>(); for (String wv : checkedInternalLibElems) { internalLibPathList.add(wv); } bean.setInternalLibPathList(internalLibPathList); // 保存. JSLintConfigManager.saveConfig(project); if (JSLintConfigManager.getConfigBean(project).equals(JSLintConfigManager.getDefaultConfigBean(project))) { return true; } try { if (CheckJavaScriptUtils.isIncludeJslintNature(project)) { // .jslintファイルがパーサーによってロックされてしまうので解除する. ParserManager.cancelCurrentParser(); JSLintConfigManager.saveConfig(project); WorkspaceJob job = new WorkspaceJob(Messages.T0005.getText()) { @Override public IStatus runInWorkspace(IProgressMonitor monitor) { try { Parser parse = JsParserFactory.createParser(project); parse.parse(monitor); } catch (CoreException e) { logger.put(Messages.EM0001, e); return e.getStatus(); } catch (InterruptedException e) { return Status.CANCEL_STATUS; } return Status.OK_STATUS; } }; job.setUser(true); job.schedule(); } else { JSLintConfigManager.saveConfig(project); } } catch (CoreException e) { logger.put(Messages.EM0001, e); } return true; } /* * (非 Javadoc) * * @see org.eclipse.jface.preference.PreferencePage#performApply() */ @Override protected void performApply() { } /** * 入力項目のチェックの前の初期設定.<br> * エラーメッセージをクリア.validをtrueにする. */ private void initCheck() { setErrorMessage(null); setValid(true); } /** * メッセージリストを組み立てる. * * @param errorMessages メッセージ. * @return 組立後のメッセージ. */ private String buildMessage(String[] errorMessages) { StringBuilder sb = new StringBuilder(); for (String message : errorMessages) { sb.append(message); } return sb.toString(); } }