/******************************************************************************* * Copyright (c) 2012-2015 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.jseditor.client.preference.keymaps; import java.util.List; import java.util.Map.Entry; import org.eclipse.che.ide.jseditor.client.editortype.EditorType; import org.eclipse.che.ide.jseditor.client.editortype.EditorTypeRegistry; import org.eclipse.che.ide.jseditor.client.keymap.Keymap; import org.eclipse.che.ide.jseditor.client.keymap.KeymapChangeEvent; import org.eclipse.che.ide.jseditor.client.keymap.KeymapValuesHolder; import org.eclipse.che.ide.jseditor.client.preference.EditorPreferenceSection; import org.eclipse.che.ide.jseditor.client.prefmodel.KeymapPrefReader; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.inject.Inject; import com.google.web.bindery.event.shared.EventBus; /** Presenter for the keymap preference selection section. */ public class KeyMapsPreferencePresenter implements EditorPreferenceSection, KeymapsPreferenceView.ActionDelegate { private final KeymapsPreferenceView view; private final KeymapPrefReader keymapPrefReader; private final EventBus eventBus; private KeymapValuesHolder keymapValuesHolder; private KeymapValuesHolder prefKeymaps; /** Has any of the keymap preferences been changed ? */ private boolean dirty = false; /** The preference page presenter. */ private ParentPresenter parentPresenter; private EditorTypeRegistry editorTypeRegistry; @Inject public KeyMapsPreferencePresenter(final KeymapsPreferenceView view, final KeymapPrefReader keymapPrefReader, final EventBus eventBus, final EditorTypeRegistry editorTypeRegistry) { this.view = view; this.eventBus = eventBus; this.keymapPrefReader = keymapPrefReader; this.editorTypeRegistry = editorTypeRegistry; this.view.setDelegate(this); this.keymapValuesHolder = new KeymapValuesHolder(); this.view.setKeymapValuesHolder(keymapValuesHolder); this.prefKeymaps = new KeymapValuesHolder(); } @Override public void storeChanges() { keymapPrefReader.storePrefs(this.keymapValuesHolder); for (final Entry<EditorType, Keymap> entry : this.keymapValuesHolder) { this.eventBus.fireEvent(new KeymapChangeEvent(entry.getKey().getEditorTypeKey(), entry.getValue().getKey())); } dirty = false; } @Override public void refresh() { readPreferenceFromPreferenceManager(); view.refresh(); } protected void readPreferenceFromPreferenceManager() { keymapPrefReader.readPref(prefKeymaps); // init the default keymap for (EditorType editorType : editorTypeRegistry.getEditorTypes()) { List<Keymap> editorKeymaps = Keymap.getInstances(editorType); if (editorKeymaps.size() > 0) { keymapValuesHolder.setKeymap(editorType, editorKeymaps.get(0)); } } for (final Entry<EditorType, Keymap> entry : prefKeymaps) { keymapValuesHolder.setKeymap(entry.getKey(), entry.getValue()); } } @Override public boolean isDirty() { return dirty; } @Override public void go(final AcceptsOneWidget container) { container.setWidget(null); readPreferenceFromPreferenceManager(); container.setWidget(view); } @Override public void setParent(final ParentPresenter parent) { this.parentPresenter = parent; } @Override public void editorKeymapChanged(final EditorType editorType, final Keymap keymap) { if (editorType == null || keymap == null) { return; } dirty = false; for (final Entry<EditorType, Keymap> entry : this.keymapValuesHolder) { final Keymap prefKeymap = prefKeymaps.getKeymap(entry.getKey()); if (entry.getValue() == null) { dirty = (prefKeymap != null); } else { dirty = !(entry.getValue().equals(prefKeymap)); } if (dirty) { break; } } parentPresenter.signalDirtyState(); } }