/*
* Copyright 2008-2009 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code 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 General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package org.visage.ideaplugin.project;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.projectRoots.*;
import com.intellij.openapi.util.Comparing;
import javax.swing.*;
import java.awt.*;
/**
* @author David Kaspar
*/
public final class VisageSdkAdditionalDataConfigurable implements AdditionalDataConfigurable {
private final SdkModel sdkModel;
private final SdkModel.Listener listener;
private final DefaultComboBoxModel model;
private final VisageSdkAdditionalDataPanel panel;
private Sdk visageSdk;
public VisageSdkAdditionalDataConfigurable (SdkModel sdkModel) {
this.sdkModel = sdkModel;
model = new DefaultComboBoxModel ();
panel = new VisageSdkAdditionalDataPanel ();
panel.javaSdkCombo.setModel (model);
panel.javaSdkCombo.setRenderer (new DefaultListCellRenderer() {
public Component getListCellRendererComponent (JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
return super.getListCellRendererComponent (list, value instanceof ProjectJdk ? ((ProjectJdk) value).getName (): value, index, isSelected, cellHasFocus);
}
});
listener = new SdkModel.Listener() {
public void sdkAdded (Sdk sdk) {
reloadModel ();
}
public void beforeSdkRemove (Sdk sdk) {
reloadModel ();
}
public void sdkChanged (Sdk sdk, String previousName) {
reloadModel ();
}
public void sdkHomeSelected (Sdk sdk, String newSdkHome) {
reloadModel ();
}
};
}
private void reloadModel () {
model.removeAllElements ();
Object previouslySelected = model.getSelectedItem ();
for (Sdk sdk : sdkModel.getSdks ()) {
SdkType sdkType = sdk.getSdkType ();
if (Comparing.equal (sdkType, JavaSdk.getInstance ()) || "IDEA JDK".equals (sdkType.getName ()))
model.addElement (sdk);
}
model.setSelectedItem (previouslySelected);
}
public void setSdk (Sdk sdk) {
visageSdk = sdk;
}
public JComponent createComponent () {
sdkModel.addListener (listener);
reloadModel ();
reset ();
apply ();
return panel.panel;
}
public boolean isModified () {
VisageSdkAdditionalData additionalData = (VisageSdkAdditionalData) visageSdk.getSdkAdditionalData();
Sdk selectedSdk = (Sdk) model.getSelectedItem ();
return additionalData == null || ! Comparing.equal(selectedSdk != null ? selectedSdk.getName () : null, additionalData.getJavaSdkName());
}
public void apply () {
final SdkModificator modificator = visageSdk.getSdkModificator ();
Sdk selectedSdk = (Sdk) model.getSelectedItem ();
modificator.setSdkAdditionalData (new VisageSdkAdditionalData (selectedSdk != null ? selectedSdk.getName () : null, sdkModel));
ApplicationManager.getApplication ().runWriteAction (new Runnable() {
public void run () {
modificator.commitChanges ();
}
});
visageSdk.getSdkType ().setupSdkPaths (visageSdk);
}
public void reset () {
VisageSdkAdditionalData data = (VisageSdkAdditionalData) visageSdk.getSdkAdditionalData ();
if (data != null) {
Sdk sdk = data.findSdk ();
if (sdk != null)
model.setSelectedItem (sdk);
}
}
public void disposeUIResources () {
sdkModel.removeListener (listener);
}
}