package bluej.pkgmgr.target;

import bluej.Config;
import bluej.pkgmgr.Package;
import bluej.pkgmgr.PackageEditor;
import bluej.pkgmgr.PkgMgrFrame;
import bluej.utility.Debug;
import bluej.utility.DialogManager;
import bluej.utility.javafx.JavaFXUtil;

import java.io.File;
import java.lang.reflect.Array;
import java.util.Properties;

import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;

import threadchecker.OnThread;
import threadchecker.Tag;


| A sub package (or parent package) | | @author Michael Cahill | public class PackageTarget extends Target{ static final int MIN_WIDTH = 60; static final int MIN_HEIGHT = 40; private static final int TAB_HEIGHT = 12; static final String openStr = Config.getString("pkgmgr.packagemenu.open"); static final String removeStr = Config.getString("pkgmgr.packagemenu.remove"); @OnThread(Tag.FXPlatform) private boolean isMoveable = true; public PackageTarget(Package pkg, String baseName) { super(pkg, baseName); JavaFXUtil.addStyleClass(pane, "package-target"); Label name = new Label(baseName); JavaFXUtil.addStyleClass(name, "package-target-name"); name.setMaxWidth(9999.0); pane.setTop(name); setSize(calculateWidth(name, baseName), DEF_HEIGHT + TAB_HEIGHT); Pane center = new Pane(); BorderPane centerWrapper = new BorderPane(center); pane.setCenter(centerWrapper); JavaFXUtil.addStyleClass(centerWrapper, "package-target-preview-wrapper"); JavaFXUtil.addStyleClass(center, "package-target-preview"); double pos[] = new double[] {0.25,0.5, 0.75, 0.2, 0.6,0.8 }; for (int i = 0; i < 3; i++) { Pane r = new Pane(); r.setMouseTransparent(true); r.prefWidthProperty().bind(center.widthProperty().multiply(0.2)); r.prefHeightProperty().bind(center.heightProperty().multiply(0.2)); r.layoutXProperty().bind(center.widthProperty().multiply(pos[i*2+0]-0.1)); r.layoutYProperty().bind(center.heightProperty().multiply(pos[i*2+1]-0.1));
| | |//r.setMaxWidth(Region.USE_PREF_SIZE); | |//r.setMaxHeight(Region.USE_PREF_SIZE); | |r.setMinWidth(10); | |r.setMinHeight(5); | |AnchorPane.setLeftAnchor(r, pos[i * 2 + 0] * center.getWidth()); | |AnchorPane.setRightAnchor(r, (pos[i * 2 + 0]+0.2) * center.getWidth()); | |AnchorPane.setTopAnchor(r, pos[i * 2 + 1] * center.getHeight()); | |AnchorPane.setBottomAnchor(r, (pos[i * 2 + 1]+0.2) * center.getHeight()); | |int iFinal = i; | |JavaFXUtil.addChangeListener(center.widthProperty(), w -> {}AnchorPane.setLeftAnchor(r, pos[iFinal * 2 + 0] * w.doubleValue()); | |AnchorPane.setRightAnchor(r, (pos[iFinal * 2 + 0]+0.2) * w.doubleValue()); | |}); | |JavaFXUtil.addChangeListener(center.heightProperty(), h -> {}AnchorPane.setTopAnchor(r, pos[iFinal * 2 + 1] * h.doubleValue()); | |AnchorPane.setBottomAnchor(r, (pos[iFinal * 2 + 1]+0.2) * h.doubleValue()); | |}); JavaFXUtil.addStyleClass(r, "package-target-preview-item"); center.getChildren().add(r); } }
| Return the target's base name (ie the name without the package name). eg. | Target | @OnThread(Tag.Any) public String getBaseName() { return getIdentifierName(); }
| Return the target's name, including the package name. eg. bluej.pkgmgr | public String getQualifiedName() { return getOpenPkgName(); } @Override public void load(Properties props, String prefix) throws NumberFormatException { super.load(props, prefix); } @Override @OnThread(Tag.FXPlatform) public void save(Properties props, String prefix) { super.save(props, prefix); props.put(prefix + ".type", "PackageTarget"); }
| Deletes applicable files (directory and ALL contentes) prior to this | PackageTarget being removed from a Package. | public void deleteFiles() { deleteDir(new File(getPackage().getPath(), getBaseName())); }
| Delete a directory recursively. | This method will delete all files and subdirectories in any | directory without asking questions. Use with care. | | @param directory The directory that will be deleted. | private void deleteDir(File directory) { File[] fileList = directory.listFiles(); if (fileList == null) { try{ directory.delete(); } catch (SecurityException se){ Debug.message("Trouble deleting: "+directory+se); } } else { if (getPackage().getProject().prepareDeleteDir(directory)) { for (int i=0;i<Array.getLength(fileList);i++) { deleteDir(fileList[i]); } directory.delete(); } } }
| Called when a package icon in a GraphEditor is double clicked. Creates a | new PkgFrame when a package is drilled down on. | @Override @OnThread(Tag.FXPlatform) public void doubleClick(boolean openInNewWindow) { getPackage().getEditor().openPackage(getOpenPkgName()); }
| Disply the context menu. | @Override @OnThread(Tag.FXPlatform) public void popupMenu(int x, int y, PackageEditor graphEditor) { ContextMenu menu = createMenu(); if (menu != null) { showingMenu(menu); menu.show(pane, x, y); } }
| Construct a popup menu which displays all our parent packages. | @OnThread(Tag.FXPlatform) private ContextMenu createMenu() { MenuItem open = new MenuItem(openStr); open.setOnAction(e -> { getPackage().getEditor().openPackage(getOpenPkgName()); }); JavaFXUtil.addStyleClass(open, "class-action-inbuilt"); ContextMenu contextMenu = new ContextMenu(open); if (isRemovable()) { MenuItem remove = new MenuItem(removeStr); remove.setOnAction(e -> { remove(); }); JavaFXUtil.addStyleClass(remove, "class-action-inbuilt"); contextMenu.getItems().add(remove); } return contextMenu; } @OnThread(Tag.Any) protected boolean isRemovable() { return true; } @OnThread(Tag.Any) protected String getOpenPkgName() { return getPackage().getQualifiedName(getBaseName()); } @Override public void remove() { PkgMgrFrame pmf = PkgMgrFrame.findFrame(getPackage()); String name = getQualifiedName(); PkgMgrFrame[] f = PkgMgrFrame.getAllProjectFrames(pmf.getProject(), name); if (f != null) { DialogManager.showErrorFX(pmf.getFXWindow(), "remove-package-open"); } else { int response = DialogManager.askQuestionFX(pmf.getFXWindow(), "really-remove-package"); if (response == 0) { deleteFiles(); getPackage().getProject().removePackage(getQualifiedName()); getPackage().removeTarget(this); } } }
| Removes the package associated with this target unconditionally. | public void removeImmediate() { deleteFiles(); getPackage().removeTarget(this); getPackage().getProject().removePackage(getQualifiedName()); } @Override @OnThread(Tag.FXPlatform) public void setSize(int width, int height) { super.setSize(Math.max(width, MIN_WIDTH), Math.max(height, MIN_HEIGHT)); } @OnThread(Tag.FXPlatform) public boolean isMoveable() { return isMoveable; } @OnThread(Tag.FXPlatform) public void setIsMoveable(boolean isMoveable) { this.isMoveable = isMoveable; } }
top, use, map, class PackageTarget

.   PackageTarget
.   getBaseName
.   getQualifiedName
.   load
.   save
.   deleteFiles
.   deleteDir
.   doubleClick
.   popupMenu
.   createMenu
.   isRemovable
.   getOpenPkgName
.   remove
.   removeImmediate
.   setSize
.   isMoveable
.   setIsMoveable




285 neLoCode + 32 LoComm