/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * 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 * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.ext.java.client.refactoring.move.wizard; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.cellview.client.CellTree; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SingleSelectionModel; import com.google.inject.Inject; import com.google.inject.Singleton; import org.eclipse.che.ide.api.resources.Resource; import org.eclipse.che.ide.api.theme.Style; import org.eclipse.che.ide.ext.java.client.JavaLocalizationConstant; import org.eclipse.che.ide.ext.java.client.JavaResources; import org.eclipse.che.ide.ext.java.client.refactoring.RefactorInfo; import org.eclipse.che.ide.ext.java.client.refactoring.move.MoveType; import org.eclipse.che.ide.ext.java.client.refactoring.move.RefactoredItemType; import org.eclipse.che.ide.ext.java.shared.dto.model.JavaProject; import org.eclipse.che.ide.ext.java.shared.dto.model.PackageFragment; import org.eclipse.che.ide.ext.java.shared.dto.model.PackageFragmentRoot; import org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringStatus; import org.eclipse.che.ide.ext.java.shared.dto.refactoring.RefactoringStatusEntry; import org.eclipse.che.ide.ui.cellview.CellTreeResources; import org.eclipse.che.ide.ui.window.Window; import java.util.List; import static org.eclipse.che.ide.ext.java.client.refactoring.move.MoveType.REFACTOR_MENU; import static org.eclipse.che.ide.ext.java.client.refactoring.move.RefactoredItemType.COMPILATION_UNIT; /** * @author Dmitry Shnurenko * @author Valeriy Svydenko */ @Singleton final class MoveViewImpl extends Window implements MoveView { interface MoveViewImplUiBinder extends UiBinder<Widget, MoveViewImpl> { } private static MoveViewImplUiBinder UI_BINDER = GWT.create(MoveViewImplUiBinder.class); @UiField SimplePanel icon; @UiField TextBox patternField; @UiField CheckBox updateFullNames; @UiField Label classNameUR; @UiField CheckBox updateReferences; @UiField ScrollPanel treePanel; @UiField Label className; @UiField FlowPanel treePanelToHide; @UiField FlowPanel patternsPanelToHide; @UiField Label errorLabel; @UiField(provided = true) final JavaLocalizationConstant locale; private final CellTreeResources cellTreeResources; private final JavaResources resources; private ActionDelegate delegate; private Button preview; private Button accept; @Inject public MoveViewImpl(JavaLocalizationConstant locale, CellTreeResources cellTreeResources, JavaResources resources) { this.locale = locale; this.cellTreeResources = cellTreeResources; this.resources = resources; setTitle(locale.moveDialogTitle()); setWidget(UI_BINDER.createAndBindUi(this)); createButtons(locale); updateFullNames.addValueChangeHandler(new ValueChangeHandler<Boolean>() { @Override public void onValueChange(ValueChangeEvent<Boolean> event) { patternField.setEnabled(event.getValue()); } }); } private void createButtons(JavaLocalizationConstant locale) { preview = createButton(locale.moveDialogButtonPreview(), "move-preview-button", new ClickHandler() { @Override public void onClick(ClickEvent event) { delegate.onPreviewButtonClicked(); } }); Button cancel = createButton(locale.moveDialogButtonCancel(), "move-cancel-button", new ClickHandler() { @Override public void onClick(ClickEvent event) { hide(); delegate.onCancelButtonClicked(); } }); accept = createButton(locale.moveDialogButtonOk(), "move-accept-button", new ClickHandler() { @Override public void onClick(ClickEvent event) { delegate.onAcceptButtonClicked(); } }); addButtonToFooter(accept); addButtonToFooter(cancel); addButtonToFooter(preview); } /** {@inheritDoc} */ @Override public void setDelegate(ActionDelegate delegate) { this.delegate = delegate; } /** {@inheritDoc} */ @Override public void show(RefactorInfo refactorInfo) { MoveType moveType = refactorInfo.getMoveType(); RefactoredItemType refactoredItemType = refactorInfo.getRefactoredItemType(); treePanelToHide.setVisible(REFACTOR_MENU.equals(moveType)); patternsPanelToHide.setVisible(COMPILATION_UNIT.equals(refactoredItemType)); Resource[] selectedItems = refactorInfo.getResources(); int selectionSize = selectedItems.length; boolean isMultiSelection = selectionSize > 1; classNameUR.setText(isMultiSelection ? locale.multiSelectionReferences(selectionSize) : selectedItems[0].getName()); className.setText(isMultiSelection ? locale.multiSelectionDestination(selectionSize) : selectedItems[0].getName()); show(); } /** {@inheritDoc} */ @Override public void clearErrorLabel() { errorLabel.setText(""); } /** {@inheritDoc} */ @Override public void setTreeOfDestinations(RefactorInfo refactorInfo, List<JavaProject> projects) { final SingleSelectionModel<Object> selectionModel = new SingleSelectionModel<>(); selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { Object object = selectionModel.getSelectedObject(); if (object instanceof JavaProject) { JavaProject project = (JavaProject)object; delegate.setMoveDestinationPath(project.getPath(), project.getPath()); } if (object instanceof PackageFragmentRoot) { PackageFragmentRoot fragmentRoot = (PackageFragmentRoot)object; delegate.setMoveDestinationPath(fragmentRoot.getPath(), fragmentRoot.getProjectPath()); } if (object instanceof PackageFragment) { PackageFragment fragment = (PackageFragment)object; delegate.setMoveDestinationPath(fragment.getPath(), fragment.getProjectPath()); } } }); CellTree tree = new CellTree(new ProjectsAndPackagesModel(projects, refactorInfo, selectionModel, resources), null, cellTreeResources); tree.setAnimationEnabled(true); treePanel.clear(); treePanel.add(tree); } /** {@inheritDoc} */ @Override public void showStatusMessage(RefactoringStatus status) { errorLabel.getElement().getStyle().setColor(Style.getMainFontColor()); showMessage(status); } /** {@inheritDoc} */ @Override public void showErrorMessage(RefactoringStatus status) { errorLabel.getElement().getStyle().setColor("#C34d4d"); showMessage(status); } /** {@inheritDoc} */ @Override public void setEnablePreviewButton(boolean isEnable) { accept.setEnabled(isEnable); } /** {@inheritDoc} */ @Override public void setEnableAcceptButton(boolean isEnable) { preview.setEnabled(isEnable); } private void showMessage(RefactoringStatus status) { RefactoringStatusEntry statusEntry = getEntryMatchingSeverity(status.getSeverity(), status.getEntries()); if (statusEntry != null) { errorLabel.setText(statusEntry.getMessage()); } else { errorLabel.setText(""); } } /** {@inheritDoc} */ @Override public void clearStatusMessage() { errorLabel.setText(""); } /** {@inheritDoc} */ @Override public boolean isUpdateReferences() { return updateReferences.getValue(); } /** {@inheritDoc} */ @Override public boolean isUpdateQualifiedNames() { return updateFullNames.getValue(); } /** {@inheritDoc} */ @Override public String getFilePatterns() { return patternField.getValue(); } /** * Returns the first entry which severity is equal or greater than the * given severity. If more than one entry exists that matches the * criteria the first one is returned. Returns <code>null</code> if no * entry matches. * * @param severity * the severity to search for. Must be one of <code>FATAL * </code>, <code>ERROR</code>, <code>WARNING</code> or <code>INFO</code> * @param entries * list of refactoring status * @return the entry that matches the search criteria */ private RefactoringStatusEntry getEntryMatchingSeverity(int severity, List<RefactoringStatusEntry> entries) { for (RefactoringStatusEntry entry : entries) { if (entry.getSeverity() >= severity) return entry; } return null; } }