Java tutorial
/******************************************************************************* * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * *******************************************************************************/ package com.liferay.ide.project.ui.wizard; import com.liferay.ide.core.util.CoreUtil; import com.liferay.ide.core.util.StringPool; import com.liferay.ide.project.core.ISDKProjectsImportDataModelProperties; import com.liferay.ide.project.core.ProjectRecord; import com.liferay.ide.project.core.util.ProjectUtil; import com.liferay.ide.project.ui.ProjectUI; import com.liferay.ide.sdk.core.SDK; import com.liferay.ide.sdk.core.SDKManager; import com.liferay.ide.ui.util.SWTUtil; import java.io.File; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.layout.PixelConverter; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; import org.eclipse.wst.server.ui.ServerUIUtil; import org.eclipse.wst.web.ui.internal.wizards.DataModelFacetCreationWizardPage; /** * @author Greg Amerson */ @SuppressWarnings({ "restriction", "unchecked", "rawtypes" }) public class SDKProjectsImportWizardPage extends DataModelFacetCreationWizardPage implements ISDKProjectsImportDataModelProperties { protected final class ProjectLabelProvider extends LabelProvider implements IColorProvider { public Color getBackground(Object element) { return null; } public Color getForeground(Object element) { ProjectRecord projectRecord = (ProjectRecord) element; if (projectRecord.hasConflicts()) { return getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY); } return null; } public String getText(Object element) { return ((ProjectRecord) element).getProjectLabel(); } } protected Label labelProjectsList; protected long lastModified; protected String lastPath; protected CheckboxTreeViewer projectsList; protected Text sdkLocation; protected Text sdkVersion; protected Object[] selectedProjects = new ProjectRecord[0]; protected Combo serverTargetCombo; protected IProject[] wsProjects; public SDKProjectsImportWizardPage(IDataModel model, String pageName) { super(model, pageName); setTitle(Msgs.importLiferayProjects); setDescription(Msgs.selectLiferayPluginSDK); } protected void createPluginsSDKField(Composite parent) { SelectionAdapter selectionAdapter = new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { SDKProjectsImportWizardPage.this.synchHelper.synchAllUIWithModel(); updateProjectsList(getDataModel().getStringProperty(SDK_LOCATION)); validatePage(true); } }; new LiferaySDKField(parent, getDataModel(), selectionAdapter, LIFERAY_SDK_NAME, this.synchHelper); } protected void createProjectsList(Composite workArea) { labelProjectsList = new Label(workArea, SWT.NONE); labelProjectsList.setText(Msgs.importProjectsLabel); labelProjectsList.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1)); projectsList = new CheckboxTreeViewer(workArea, SWT.BORDER); GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1); gridData.widthHint = new PixelConverter(projectsList.getControl()).convertWidthInCharsToPixels(25); gridData.heightHint = new PixelConverter(projectsList.getControl()).convertHeightInCharsToPixels(10); projectsList.getControl().setLayoutData(gridData); projectsList.setContentProvider(new ITreeContentProvider() { public void dispose() { } public Object[] getChildren(Object parentElement) { return null; } public Object[] getElements(Object inputElement) { return getProjectRecords(); } public Object getParent(Object element) { return null; } public boolean hasChildren(Object element) { return false; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }); projectsList.setLabelProvider(createProjectsListLabelProvider()); projectsList.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { handleCheckStateChangedEvent(event); } }); projectsList.setInput(this); projectsList.setComparator(new ViewerComparator()); createSelectionButtons(workArea); } protected IBaseLabelProvider createProjectsListLabelProvider() { return new ProjectLabelProvider(); } protected void createSDKLocationField(Composite topComposite) { SWTUtil.createLabel(topComposite, SWT.LEAD, Msgs.liferayPluginSDKLocationLabel, 1); sdkLocation = SWTUtil.createText(topComposite, 1); ((GridData) sdkLocation.getLayoutData()).widthHint = 300; this.synchHelper.synchText(sdkLocation, SDK_LOCATION, null); SWTUtil.createLabel(topComposite, SWT.LEAD, StringPool.EMPTY, 1); // Button iconFileBrowse = SWTUtil.createPushButton(topComposite, "Browse...", null); // iconFileBrowse.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); // iconFileBrowse.addSelectionListener(new SelectionAdapter() { // // @Override // public void widgetSelected(SelectionEvent e) { // handleFileBrowseButton(SDKProjectsImportWizardPage.this.sdkLocation); // } // // }); } protected void createSDKVersionField(Composite topComposite) { SWTUtil.createLabel(topComposite, SWT.LEAD, Msgs.liferayPluginSDKVersionLabel, 1); sdkVersion = SWTUtil.createText(topComposite, 1); this.synchHelper.synchText(sdkVersion, SDK_VERSION, null); SWTUtil.createLabel(topComposite, StringPool.EMPTY, 1); } /** * Create the selection buttons in the listComposite. * * @param listComposite */ protected void createSelectionButtons(Composite listComposite) { Composite buttonsComposite = new Composite(listComposite, SWT.NONE); GridLayout layout = new GridLayout(); layout.marginWidth = 0; layout.marginHeight = 0; buttonsComposite.setLayout(layout); buttonsComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); Button selectAll = new Button(buttonsComposite, SWT.PUSH); selectAll.setText(Msgs.selectAll); selectAll.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleSelectAll(e); } }); Dialog.applyDialogFont(selectAll); setButtonLayoutData(selectAll); Button deselectAll = new Button(buttonsComposite, SWT.PUSH); deselectAll.setText(Msgs.deselectAll); deselectAll.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleDeselectAll(e); } }); Dialog.applyDialogFont(deselectAll); setButtonLayoutData(deselectAll); Button refresh = new Button(buttonsComposite, SWT.PUSH); refresh.setText(Msgs.refresh); refresh.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleRefresh(e); } }); Dialog.applyDialogFont(refresh); setButtonLayoutData(refresh); } protected void createTargetRuntimeGroup(Composite parent) { Label label = new Label(parent, SWT.NONE); label.setText(Msgs.liferayTargetRuntimeLabel); label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); serverTargetCombo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY); serverTargetCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Button newServerTargetButton = new Button(parent, SWT.NONE); newServerTargetButton.setText(Msgs.newButton); newServerTargetButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { final DataModelPropertyDescriptor[] preAdditionDescriptors = model .getValidPropertyDescriptors(FACET_RUNTIME); boolean isOK = ServerUIUtil.showNewRuntimeWizard(getShell(), getModuleTypeID(), null, "com.liferay."); //$NON-NLS-1$ if (isOK) { DataModelPropertyDescriptor[] postAdditionDescriptors = model .getValidPropertyDescriptors(FACET_RUNTIME); Object[] preAddition = new Object[preAdditionDescriptors.length]; for (int i = 0; i < preAddition.length; i++) { preAddition[i] = preAdditionDescriptors[i].getPropertyValue(); } Object[] postAddition = new Object[postAdditionDescriptors.length]; for (int i = 0; i < postAddition.length; i++) { postAddition[i] = postAdditionDescriptors[i].getPropertyValue(); } Object newAddition = CoreUtil.getNewObject(preAddition, postAddition); if (newAddition != null) // can this ever be null? model.setProperty(FACET_RUNTIME, newAddition); } } }); Control[] deps = new Control[] { newServerTargetButton }; synchHelper.synchCombo(serverTargetCombo, FACET_RUNTIME, deps); if (serverTargetCombo.getSelectionIndex() == -1 && serverTargetCombo.getVisibleItemCount() != 0) { serverTargetCombo.select(0); } } @Override protected Composite createTopLevelComposite(Composite parent) { Composite topComposite = SWTUtil.createTopComposite(parent, 3); GridLayout gl = new GridLayout(3, false); // gl.marginLeft = 5; topComposite.setLayout(gl); topComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1)); createPluginsSDKField(topComposite); SWTUtil.createSeparator(topComposite, 3); createSDKLocationField(topComposite); createSDKVersionField(topComposite); SWTUtil.createVerticalSpacer(topComposite, 1, 3); createProjectsList(topComposite); createTargetRuntimeGroup(topComposite); return topComposite; } @Override protected void enter() { String sdkName = getDataModel().getStringProperty(LIFERAY_SDK_NAME); if (sdkName != null) { SDK initialSdk = SDKManager.getInstance().getSDK(sdkName); if (initialSdk != null) { updateProjectsList(initialSdk.getLocation().toOSString()); } } } public Object[] getProjectRecords() { List projectRecords = new ArrayList(); for (int i = 0; i < selectedProjects.length; i++) { ProjectRecord projectRecord = (ProjectRecord) selectedProjects[i]; if (isProjectInWorkspace(projectRecord.getProjectName())) { projectRecord.setHasConflicts(true); } projectRecords.add(selectedProjects[i]); } return (ProjectRecord[]) projectRecords.toArray(new ProjectRecord[projectRecords.size()]); } protected IProject[] getProjectsInWorkspace() { if (wsProjects == null) { wsProjects = IDEWorkbenchPlugin.getPluginWorkspace().getRoot().getProjects(); } return wsProjects; } @Override protected String[] getValidationPropertyNames() { return new String[] { SDK_LOCATION, SDK_VERSION, SELECTED_PROJECTS, FACET_RUNTIME }; } protected void handleCheckStateChangedEvent(CheckStateChangedEvent event) { ProjectRecord element = (ProjectRecord) event.getElement(); if (element.hasConflicts()) { projectsList.setChecked(element, false); } getDataModel().setProperty(SELECTED_PROJECTS, projectsList.getCheckedElements()); setPageComplete(projectsList.getCheckedElements().length > 0); } protected void handleDeselectAll(SelectionEvent e) { projectsList.setCheckedElements(new Object[0]); getDataModel().setProperty(SELECTED_PROJECTS, projectsList.getCheckedElements()); validatePage(true); setPageComplete(false); } protected void handleFileBrowseButton(final Text text) { DirectoryDialog dd = new DirectoryDialog(this.getShell(), SWT.OPEN); dd.setText(Msgs.selectLiferayPluginSDKFolder); if (!CoreUtil.isNullOrEmpty(sdkLocation.getText())) { dd.setFilterPath(sdkLocation.getText()); } String dir = dd.open(); if (!CoreUtil.isNullOrEmpty(dir)) { sdkLocation.setText(dir); updateProjectsList(dir); synchHelper.synchAllUIWithModel(); validatePage(); } } protected void handleRefresh(SelectionEvent e) { // force a project refresh lastModified = -1; updateProjectsList(sdkLocation.getText().trim()); projectsList.setCheckedElements(new Object[0]); getDataModel().setProperty(SELECTED_PROJECTS, projectsList.getCheckedElements()); } // @Override // protected void enter() { // super.enter(); // // if (!CoreUtil.isNullOrEmpty(sdkLocation.getText())) { // updateProjectsList(sdkLocation.getText()); // } // else { // String lastLocation = // ProjectUIPlugin.getDefault().getPreferenceStore().getString( // ProjectUIPlugin.LAST_SDK_IMPORT_LOCATION_PREF); // // if (!CoreUtil.isNullOrEmpty(lastLocation)) { // sdkLocation.setText(lastLocation); // // updateProjectsList(lastLocation); // // synchHelper.synchAllUIWithModel(); // // validatePage(); // } // } // } protected void handleSelectAll(SelectionEvent e) { for (int i = 0; i < selectedProjects.length; i++) { ProjectRecord projectRecord = (ProjectRecord) selectedProjects[i]; if (projectRecord.hasConflicts()) { projectsList.setChecked(projectRecord, false); } else { projectsList.setChecked(projectRecord, true); } } getDataModel().setProperty(SELECTED_PROJECTS, projectsList.getCheckedElements()); validatePage(true); // setPageComplete(projectsList.getCheckedElements().length > // 0); } protected boolean isProjectInWorkspace(String projectName) { if (projectName == null) { return false; } IProject[] workspaceProjects = getProjectsInWorkspace(); for (int i = 0; i < workspaceProjects.length; i++) { if (projectName.equals(workspaceProjects[i].getName())) { return true; } } return false; } @Override protected boolean showValidationErrorsOnEnter() { return true; } public void updateProjectsList(final String path) { // on an empty path empty selectedProjects if (path == null || path.length() == 0) { setMessage(Msgs.importProjectsDescription); selectedProjects = new ProjectRecord[0]; projectsList.refresh(true); projectsList.setCheckedElements(selectedProjects); setPageComplete(projectsList.getCheckedElements().length > 0); lastPath = path; return; } final File directory = new File(path); long modified = directory.lastModified(); if (path.equals(lastPath) && lastModified == modified) { // since the file/folder was not modified and the path did not // change, no refreshing is required return; } lastPath = path; lastModified = modified; final boolean dirSelected = true; try { getContainer().run(true, true, new IRunnableWithProgress() { /* * (non-Javadoc) * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org * .eclipse.core.runtime.IProgressMonitor) */ public void run(IProgressMonitor monitor) { monitor.beginTask(Msgs.searchingMessage, 100); selectedProjects = new ProjectRecord[0]; Collection<File> eclipseProjectFiles = new ArrayList<File>(); Collection<File> liferayProjectDirs = new ArrayList<File>(); monitor.worked(10); if (dirSelected && directory.isDirectory()) { if (!ProjectUtil.collectSDKProjectsFromDirectory(eclipseProjectFiles, liferayProjectDirs, directory, null, true, monitor)) { return; } selectedProjects = new ProjectRecord[eclipseProjectFiles.size() + liferayProjectDirs.size()]; int index = 0; monitor.worked(50); monitor.subTask(Msgs.processingMessage); for (File eclipseProjectFile : eclipseProjectFiles) { selectedProjects[index++] = new ProjectRecord(eclipseProjectFile); } for (File liferayProjectDir : liferayProjectDirs) { selectedProjects[index++] = new ProjectRecord(liferayProjectDir); } } else { monitor.worked(60); } monitor.done(); } }); } catch (InvocationTargetException e) { ProjectUI.logError(e); } catch (InterruptedException e) { // Nothing to do if the user interrupts. } projectsList.refresh(true); Object[] projects = getProjectRecords(); boolean displayWarning = false; for (int i = 0; i < projects.length; i++) { ProjectRecord projectRecord = (ProjectRecord) projects[i]; if (projectRecord.hasConflicts()) { displayWarning = true; projectsList.setGrayed(projects[i], true); } // else { // projectsList.setChecked(projects[i], true); // } } if (displayWarning) { setMessage(Msgs.projectsInWorkspace, WARNING); } else { setMessage(Msgs.importProjectsDescription); } setPageComplete(projectsList.getCheckedElements().length > 0); if (selectedProjects.length == 0) { setMessage(Msgs.noProjectsToImport, WARNING); } // else { // if (!sdkLocation.isDisposed()) { // ProjectUIPlugin.getDefault().getPreferenceStore().setValue( // ProjectUIPlugin.LAST_SDK_IMPORT_LOCATION_PREF, sdkLocation.getText()); // } // } Object[] checkedProjects = projectsList.getCheckedElements(); if (checkedProjects != null && checkedProjects.length > 0) { selectedProjects = new ProjectRecord[checkedProjects.length]; for (int i = 0; i < checkedProjects.length; i++) { selectedProjects[i] = (ProjectRecord) checkedProjects[i]; } getDataModel().setProperty(SELECTED_PROJECTS, selectedProjects); } } private static class Msgs extends NLS { public static String deselectAll; public static String importLiferayProjects; public static String importProjectsDescription; public static String importProjectsLabel; public static String liferayPluginSDKLocationLabel; public static String liferayPluginSDKVersionLabel; public static String liferayTargetRuntimeLabel; public static String newButton; public static String noProjectsToImport; public static String processingMessage; public static String projectsInWorkspace; public static String refresh; public static String searchingMessage; public static String selectAll; public static String selectLiferayPluginSDK; public static String selectLiferayPluginSDKFolder; static { initializeMessages(SDKProjectsImportWizardPage.class.getName(), Msgs.class); } } }