package p4jdb ; import p4jdb.* ; import java.lang.* ; import java.util.* ; import java.applet.* ; import java.awt.* ; import java.awt.event.* ; import java.io.* ; import java.net.* ; /** * Represents a directory folder in the p4 depot. */ public class P4Folder implements TreeDisplay.Data { /** * Name and full path of directory */ public String name_,path_,urlPath_; /** * Vector that contains the contents of the directory * (other directories and files...) */ private Vector contents_ ; /** * true if directory "open", that is: if contents is displayed */ private boolean open_ ; /** * true of directory scanned */ private boolean scanned_ ; /** * "level" in directory tree */ private int level_ ; /** * X value for border between folder and name */ private int borderX_ ; static private String helpText = "P4DB experimental java browser" ; /** * Constructor */ public P4Folder(String name, String path, int level) { level_ = level ; name_ = name ; path_ = path+"/"+name ; urlPath_ = URLEncoder.encode(path_) ; open_ = false ; scanned_ = false ; contents_ = new Vector() ; if(level == 0) { scan(null) ; open_ = true ; } ; } ; /** * Scan */ public void scan(Component cp) { if(cp != null) cp.setCursor(new Cursor(Cursor.WAIT_CURSOR)) ; try { URL u = new URL(P4DirTree.applet.getDocumentBase(), P4DirTree.applet.getParameter("File")+ "?CMD=DIRSCAN&FSPC="+urlPath_+"/"+"*") ; URLConnection conn = u.openConnection() ; InputStreamReader isr = new InputStreamReader(conn.getInputStream()) ; BufferedReader in = new BufferedReader(isr); StreamTokenizer tok = new StreamTokenizer(in) ; int nxt ; while((nxt = tok.nextToken()) != StreamTokenizer.TT_EOF) { String type = tok.sval ; tok.nextToken() ; String name = tok.sval ; if(type.equals("D")) { contents_.addElement(new P4Folder(name, path_, level_+1)) ; } else { tok.nextToken() ; double rev = tok.nval ; tok.nextToken() ; String status = tok.sval ; contents_.addElement(new P4File(name, path_, (new Double(rev)).intValue(), level_+1, status)) ; } } scanned_ = true ; } catch (IOException e) { System.err.println("IOEx:" + e) ; } catch (Throwable e) { System.err.println(e.getMessage()) ; } ; if(cp != null) cp.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)) ; } /** * Add folder entry to vector */ void addToVector(Vector v) { v.addElement(this) ; if(open_) { Enumeration enum = contents_.elements() ; while(enum.hasMoreElements()) { Object o = enum.nextElement() ; if(o instanceof P4Folder) { ((P4Folder) o).addToVector(v) ; } else { if(o instanceof P4File) { P4File f = ((P4File) o) ; if(P4DirTree.showDeleted || !f.status_.equals("de")) v.addElement(o) ; } else { v.addElement(o) ; } } } ; } ; } /** * Collapse/expand all entries */ void setOpen(boolean open) { // System.err.println("setOpen("+open+"): "+name_) ; // DEBUG open_ = open ; Enumeration enum = contents_.elements() ; while(enum.hasMoreElements()) { Object o = enum.nextElement() ; if(o instanceof P4Folder) { ((P4Folder) o).setOpen(open) ; } } ; } /** * Draw line info *@param height Line height *@param p Start point (lower right) *@param g Graphics object to use *@return width of object drawn (or 0 if no object) */ public int draw(int height, Point p, Graphics g) { //final Color FLD_COLOR = Color.yellow ; // Folder dimension //final Dimension FLD_DIM = new Dimension((height*2)/3,height/2) ; // Folder start point (upper left of folder "main" // rectangle if(level_ > 0) { final Color FLD_COLOR = Color.yellow.brighter() ; // Folder dimension final Dimension FLD_DIM = new Dimension((height*2)/3,height/2) ; // Folder start point (upper left of folder "main" // rectangle // ** Draw a "folder" ** g.setColor(FLD_COLOR) ; // Fill folder "main" rectangle g.fillRect(p.x,p.y-FLD_DIM.height, FLD_DIM.width,FLD_DIM.height) ; g.setColor(Color.black) ; // Draw folder "main" outline g.drawRect(p.x,p.y-FLD_DIM.height, FLD_DIM.width,FLD_DIM.height) ; g.setColor(FLD_COLOR) ; // Fill folder tab g.fillRect(p.x+(FLD_DIM.width/2), p.y-2-FLD_DIM.height, FLD_DIM.width/2,2) ; g.setColor(Color.black) ; // Draw folder tab outline g.drawRect(p.x+(FLD_DIM.width/2), p.y-2-FLD_DIM.height, FLD_DIM.width/2,2) ; // ** print string borderX_ = FLD_DIM.width + 3 ; g.drawString(name_,p.x+borderX_+1,p.y) ; } else { // Draw "barrel" final Color BARREL_COLOR = Color.gray.brighter() ; final Dimension FLD_DIM = new Dimension(height,height/2) ; final int yo = 2 ; g.setColor(BARREL_COLOR) ; g.fillRect(p.x,p.y-FLD_DIM.height-yo, FLD_DIM.width,FLD_DIM.height) ; g.setColor(Color.black) ; // Draw folder tab outline g.drawRect(p.x,p.y-FLD_DIM.height-yo, FLD_DIM.width,FLD_DIM.height) ; g.setColor(BARREL_COLOR) ; g.fillOval(p.x,p.y-((FLD_DIM.height*3)/2)-yo, FLD_DIM.width,(FLD_DIM.height*2)/3) ; g.setColor(BARREL_COLOR) ; g.fillOval(p.x,p.y-1-yo, FLD_DIM.width,(FLD_DIM.height*2)/3) ; g.setColor(Color.black) ; // Draw folder tab outline g.drawOval(p.x,p.y-((FLD_DIM.height*3)/2)-yo, FLD_DIM.width,(FLD_DIM.height*2)/3) ; g.drawArc(p.x,p.y-1-yo, FLD_DIM.width,(FLD_DIM.height*2)/3,180,180) ; borderX_ = FLD_DIM.width + 3 ; g.setColor(Color.blue.brighter()) ; g.drawString(helpText,p.x+borderX_+1,p.y) ; } return borderX_ + 1 + g.getFontMetrics().stringWidth(name_) ; } /** *@return level in tree (number of tics to indent) */ public int level() { return level_ ; } /** * Invoked when the mouse has been clicked on an object. *@param cp Component where object is drawn *@param pt Point within component where mouse is clicked *@param rpt Point within object (relative to zero position * given in draw() metod */ public void mouseClicked(Component cp, Point pt, Point rpt) { if(rpt.x < borderX_) { // click on folder open_ = !open_ ; if(open_ && !scanned_) { scan(cp) ; helpText = "" ; } } else { // click on name PopupMenu popup = new PopupMenu(path_) ; final String VIEW_CHANGES = "View changes below this point" ; final String BROWSE = "Browse this directory" ; popup.add(VIEW_CHANGES) ; popup.add(BROWSE) ; popup.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { AppletContext ac = P4DirTree.applet.getAppletContext() ; try { if(e.getActionCommand() == VIEW_CHANGES) { ac.showDocument(new URL(P4DirTree.applet.getDocumentBase(), "changeList.cgi?FSPC="+urlPath_+"/...&MAXCH=100")) ; } else if (e.getActionCommand() == BROWSE){ ac.showDocument(new URL(P4DirTree.applet.getDocumentBase(), "depotTreeBrowser.cgi?FSPC="+urlPath_)) ; } } catch (Throwable t) { System.err.println("Exception: "+t.getMessage()) ; } } }) ; cp.add(popup) ; popup.show(cp,pt.x,pt.y) ; } } ; } ;