package com.digiarea.closure.model.providers; import java.io.File; import java.util.Arrays; import java.util.List; import java.util.ResourceBundle; import javafx.collections.ObservableList; import javafx.geometry.Pos; import javafx.scene.control.Label; import javafx.scene.control.ListCell; import javafx.scene.control.Tooltip; import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.scene.text.FontPosture; import com.digiarea.closure.core.IPathResolver; import com.digiarea.closure.model.Source; import com.digiarea.closure.model.SourceEntry; import com.digiarea.closure.preferences.model.ClosureLibrary; import com.digiarea.closure.preferences.model.Variable; import com.digiarea.closure.preferences.model.bind.PreferencesSerializer; import com.digiarea.closurefx.IConstants; import com.digiarea.closurefx.ResourceUtils; public class BuildpathCell extends ListCell<Source> implements IConstants { private List<SourceEntry> entry; private IPathResolver pathResolver; private ResourceBundle bundle; public BuildpathCell(ResourceBundle bundle, IPathResolver pathResolver, SourceEntry... entry) { this.entry = Arrays.asList(entry); this.bundle = bundle; this.pathResolver = pathResolver; } public void updateItem(Source item, boolean empty) { super.updateItem(item, empty); if (empty) { setText(null); } if (item != null) { ObservableList<String> classes = getStyleClass(); classes.removeAll(CSS_BUILDPATH_LIBRARY, CSS_BUILDPATH_LIBRARY_ERROR, CSS_BUILDPATH_LIBRARY_EXTERN, CSS_BUILDPATH_GSS, CSS_BUILDPATH_GSS_ERROR, CSS_BUILDPATH_GSS_EXTERN, CSS_BUILDPATH_JS, CSS_BUILDPATH_JS_ERROR, CSS_BUILDPATH_JS_EXTERN, CSS_BUILDPATH_SOY, CSS_BUILDPATH_SOY_ERROR, CSS_BUILDPATH_SOY_EXTERN, CSS_BUILDPATH_PROJECT, CSS_BUILDPATH_PACKAGE_FOLDER, CSS_BUILDPATH_PACKAGE_FOLDER_ERROR, CSS_BUILDPATH_PACKAGE_FOLDER_EXTERN, CSS_BUILDPATH_VARIABLE, CSS_BUILDPATH_VARIABLE_ERROR, CSS_BUILDPATH_CLOSURE, CSS_BUILDPATH_CLOSURE_ERROR, CSS_BUILDPATH_VARIABLE, CSS_BUILDPATH_VARIABLE_ERROR); if (entry != null && !entry.isEmpty() && !entry.contains(item.getEntryKind())) { setPrefHeight(0); setPrefWidth(0); setVisible(false); setText(null); setGraphic(null); setTooltip(null); } else { File realFile = new File( pathResolver.toRealPath(item.getPath())); boolean exist = realFile.exists(); if (!exist) { setTooltip(new Tooltip( bundle.getString(BUNDLE_JS_SOURCE_EXIST))); } setPrefHeight(getMinHeight()); setPrefWidth(getMaxWidth()); setVisible(true); String tooltip = "[" + realFile.getAbsolutePath() + "]"; HBox line = new HBox(); line.setSpacing(5); line.setAlignment(Pos.CENTER_LEFT); Label nameLabel = new Label(new File(item.getPath()).getName()); line.getChildren().add(nameLabel); Label label = new Label(item.getPath()); label.setTextFill(Color.GRAY); line.getChildren().add(label); if (item.isExtern()) { switch (item.getEntityKind()) { case GSS: break; case SOY: case JSC: tooltip = tooltip + " [" + "extern" + "]"; line.getChildren().add( new ImageView(ResourceUtils.DECORATOR_EXTERN)); break; } } if (item.isIncludeClosure()) { switch (item.getEntityKind()) { case GSS: case SOY: break; case JSC: tooltip = tooltip + " [" + "included Closure-based files" + "]"; line.getChildren().add( new ImageView(ResourceUtils.DECORATOR_CLOSURE)); break; } } if (item.isIncludeSimple()) { switch (item.getEntityKind()) { case GSS: case SOY: break; case JSC: tooltip = tooltip + " [" + "included JavaScript files" + "]"; line.getChildren().add( new ImageView(ResourceUtils.DECORATOR_JS)); break; } } setTooltip(new Tooltip(tooltip)); setGraphic(line); switch (item.getEntryKind()) { case CONTAINER: if (!exist) { classes.add(CSS_BUILDPATH_LIBRARY_ERROR); } else { classes.add(CSS_BUILDPATH_LIBRARY); } break; case FILE: switch (item.getEntityKind()) { case GSS: if (!exist) { classes.add(CSS_BUILDPATH_GSS_ERROR); } else { classes.add(CSS_BUILDPATH_GSS); } break; case JSC: if (!exist) { classes.add(CSS_BUILDPATH_JS_ERROR); } else { classes.add(CSS_BUILDPATH_JS); } break; case SOY: if (!exist) { classes.add(CSS_BUILDPATH_SOY_ERROR); } else { classes.add(CSS_BUILDPATH_SOY); } break; } break; case LIBRARY: if (!exist) { classes.add(CSS_BUILDPATH_LIBRARY_ERROR); } else { classes.add(CSS_BUILDPATH_LIBRARY); } break; case PROJECT: classes.add(CSS_BUILDPATH_PROJECT); label.setText("- not supported"); setTooltip(new Tooltip("Projects are not supported by Closure FX Builder.")); label.setTextFill(Color.RED); label.setFont(Font.font("Arial", FontPosture.ITALIC, 11)); break; case SOURCE: if (!exist) { classes.add(CSS_BUILDPATH_PACKAGE_FOLDER_ERROR); } else { classes.add(CSS_BUILDPATH_PACKAGE_FOLDER); } break; case VARIABLE: Variable variable = new PreferencesSerializer() .readVariable(item.getPath()); if (variable == null) { classes.add(CSS_BUILDPATH_VARIABLE_ERROR); setTooltip(new Tooltip( bundle.getString(JSValidator_Variable_Exist))); label.setText("???"); } else { label.setText(realFile.getAbsolutePath()); if (!exist) { classes.add(CSS_BUILDPATH_VARIABLE_ERROR); } else { classes.add(CSS_BUILDPATH_VARIABLE); } } break; case CLOSURE: ClosureLibrary library = new PreferencesSerializer() .readLibrary(item.getPath()); if (library == null) { classes.add(CSS_BUILDPATH_CLOSURE_ERROR); setTooltip(new Tooltip( bundle.getString(BUNDLE_JS_CLOSURE_EXIST))); label.setText("???"); } else { label.setText(realFile.getAbsolutePath()); if (!exist) { classes.add(CSS_BUILDPATH_CLOSURE_ERROR); } else { classes.add(CSS_BUILDPATH_CLOSURE); } } break; } } } } }