/** @return A Box for selecting an asset type, the old asset and its replacement asset. */ private Box assetChoiceBox() { TreeSet<String> types = new TreeSet<String>(); types.add(AssetType.CHARACTER.toString()); types.add(AssetType.PROP.toString()); types.add(AssetType.SET.toString()); // JDrawer toReturn; Box hbox = new Box(BoxLayout.X_AXIS); { JCollectionField assetType = UIFactory.createCollectionField(types, diag, sTSize); assetType.setActionCommand("type"); assetType.addActionListener(this); JCollectionField oldAsset = UIFactory.createCollectionField(charList.keySet(), diag, sVSize); JCollectionField newAsset = UIFactory.createCollectionField(charList.keySet(), diag, sVSize); hbox.add(assetType); hbox.add(Box.createHorizontalStrut(10)); hbox.add(oldAsset); hbox.add(Box.createHorizontalStrut(5)); hbox.add(newAsset); // pPotentials.put(oldAsset, newAsset); } list.add(Box.createVerticalStrut(5)); return hbox; // toReturn; } // return assetChoiceBox
/** Add the given source file sequence to the to be loaded set. */ private void addSourceSeq( Integer order, String sname, FileSeq fseq, DoubleMap<Integer, String, TreeSet<FileSeq>> sources) throws PipelineException { if (order != null) { String suffix = fseq.getFilePattern().getSuffix(); if (!fseq.isSingle() || (suffix == null) || !suffix.equals("hip")) throw new PipelineException( "The file sequence (" + fseq + ") of source node (" + sname + ") " + "does not contain a single Houdini scene (.hip) file!"); TreeSet<FileSeq> fseqs = sources.get(order, sname); if (fseqs == null) { fseqs = new TreeSet<FileSeq>(); sources.put(order, sname, fseqs); } fseqs.add(fseq); } }
/** * Recursively rebuild the tree nodes. * * @param root The full abstract path to the root saved layout directory. * @param local The current directory relative to root (null if none). * @param tnode The current parent tree node. */ private void rebuildTreeModel(Path root, Path local, DefaultMutableTreeNode tnode) { TreeSet<Path> subdirs = new TreeSet<Path>(); TreeSet<String> layouts = new TreeSet<String>(); { Path current = new Path(root, local); File files[] = current.toFile().listFiles(); if (files != null) { int wk; for (wk = 0; wk < files.length; wk++) { String name = files[wk].getName(); if (files[wk].isDirectory()) subdirs.add(new Path(local, name)); else if (files[wk].isFile()) layouts.add(name); } } } for (Path subdir : subdirs) { TreeData data = new TreeData(subdir); DefaultMutableTreeNode child = new DefaultMutableTreeNode(data, true); tnode.add(child); rebuildTreeModel(root, subdir, child); } for (String lname : layouts) { TreeData data = new TreeData(new Path(local, lname), lname); DefaultMutableTreeNode child = new DefaultMutableTreeNode(data, false); tnode.add(child); } }
/** Construct a new stage from the information contained in the node bundle. */ @SuppressWarnings("deprecation") public BundleStage( StageInformation stageInfo, UtilContext context, MasterMgrClient client, NodeMod mod, TreeMap<String, BaseAnnotation> annotations, TreeMap<String, String> toolsetRemap, TreeMap<String, String> selectionKeyRemap, TreeMap<String, String> licenseKeyRemap, TreeMap<String, String> hardwareKeyRemap) { super("Bundle", "Description...", stageInfo, context, client, mod, StageFunction.aNone); pOrigNodeMod = mod; { String ntset = toolsetRemap.get(mod.getToolset()); if (ntset != null) pRemappedToolset = ntset; else pRemappedToolset = super.getToolset(); } JobReqs jreqs = mod.getJobRequirements(); if (jreqs != null) { { TreeSet<String> selectionKeys = new TreeSet<String>(); for (String key : jreqs.getSelectionKeys()) { String nkey = selectionKeyRemap.get(key); if (nkey != null) selectionKeys.add(nkey); } addSelectionKeys(selectionKeys); } { TreeSet<String> licenseKeys = new TreeSet<String>(); for (String key : jreqs.getLicenseKeys()) { String nkey = licenseKeyRemap.get(key); if (nkey != null) licenseKeys.add(nkey); } addLicenseKeys(licenseKeys); } { TreeSet<String> hardwareKeys = new TreeSet<String>(); for (String key : jreqs.getHardwareKeys()) { String nkey = hardwareKeyRemap.get(key); if (nkey != null) hardwareKeys.add(nkey); } addHardwareKeys(hardwareKeys); } } for (String aname : annotations.keySet()) addAnnotation(aname, annotations.get(aname)); { TreeMap<String, BaseAnnotation> annots = mod.getAnnotations(); for (String aname : annots.keySet()) addVersionAnnotation(aname, annots.get(aname)); } }
/** * Draws the GUI that allows a user to select assets to be updated. * * @return true if the user made a valid choice of assets to replace. * @throws PipelineException */ private boolean buildUpdateGUI() throws PipelineException { Box finalBox = new Box(BoxLayout.Y_AXIS); top = new Box(BoxLayout.Y_AXIS); JScrollPane scroll; { scroll = new JScrollPane(finalBox); scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); Dimension size = new Dimension(sVSize + sVSize + sTSize + 52, 500); scroll.setMinimumSize(size); scroll.setPreferredSize(size); scroll.getViewport().setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE); } /* query the user */ diag = new JToolDialog("Propagate Asset", scroll, "Continue"); areas = mclient.getWorkingAreas(); { Box hbox = new Box(BoxLayout.X_AXIS); Component comps[] = UIFactory.createTitledPanels(); JPanel tpanel = (JPanel) comps[0]; JPanel vpanel = (JPanel) comps[1]; { userField = UIFactory.createTitledCollectionField( tpanel, "User:"******"The user whose area the node is being created in."); userField.setActionCommand("user"); userField.setSelected(PackageInfo.sUser); userField.addActionListener(this); } UIFactory.addVerticalSpacer(tpanel, vpanel, 3); { viewField = UIFactory.createTitledCollectionField( tpanel, "View:", sTSize, vpanel, areas.get(PackageInfo.sUser), diag, sVSize, "The working area to create the nodes in."); viewField.setActionCommand("wrap"); viewField.addActionListener(this); } UIFactory.addVerticalSpacer(tpanel, vpanel, 3); { toolsetField = UIFactory.createTitledCollectionField( tpanel, "Toolset:", sTSize, vpanel, mclient.getActiveToolsetNames(), diag, sVSize, "The toolset to set on all the nodes."); toolsetField.setSelected(mclient.getDefaultToolsetName()); toolsetField.setActionCommand("wrap"); toolsetField.addActionListener(this); } UIFactory.addVerticalSpacer(tpanel, vpanel, 3); w = new Wrapper( userField.getSelected(), viewField.getSelected(), toolsetField.getSelected(), mclient); charList = SonyConstants.getAssetList(w, project, AssetType.CHARACTER); setsList = SonyConstants.getAssetList(w, project, AssetType.SET); propsList = SonyConstants.getAssetList(w, project, AssetType.PROP); { projectField = UIFactory.createTitledCollectionField( tpanel, "Project:", sTSize, vpanel, Globals.getChildrenDirs(w, "/projects"), diag, sVSize, "All the projects in pipeline."); projectField.setActionCommand("proj"); projectField.addActionListener(this); } hbox.add(comps[2]); top.add(hbox); } { Box vbox = new Box(BoxLayout.Y_AXIS); Box hbox = new Box(BoxLayout.X_AXIS); JButton button = new JButton("Propagate Additional Asset"); button.setName("ValuePanelButton"); button.setRolloverEnabled(false); button.setFocusable(false); Dimension d = new Dimension(sVSize, 25); button.setPreferredSize(d); button.setMinimumSize(d); button.setMaximumSize(new Dimension(Integer.MAX_VALUE, 25)); vbox.add(Box.createRigidArea(new Dimension(0, 5))); hbox.add(button); hbox.add(Box.createRigidArea(new Dimension(4, 0))); vbox.add(hbox); vbox.add(Box.createRigidArea(new Dimension(0, 5))); button.setActionCommand("add"); button.addActionListener(this); top.add(vbox); } list = new Box(BoxLayout.Y_AXIS); test = new JDrawer("Propagate Additional Asset", list, false); top.add(test); list.add(assetChoiceBox()); finalBox.add(top); { JPanel spanel = new JPanel(); spanel.setName("Spacer"); spanel.setMinimumSize(new Dimension(sTSize + sVSize, 7)); spanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE)); spanel.setPreferredSize(new Dimension(sTSize + sVSize, 7)); finalBox.add(spanel); } diag.setVisible(true); if (diag.wasConfirmed()) { // get list of things to change. for (Component comp : list.getComponents()) { if (comp instanceof Box) { Box can = (Box) comp; JCollectionField oldOne = (JCollectionField) can.getComponent(2); JCollectionField newOne = (JCollectionField) can.getComponent(4); TreeMap<String, String> assetList = new TreeMap<String, String>(); assetList.putAll(charList); assetList.putAll(propsList); assetList.putAll(setsList); String key = assetList.get(oldOne.getSelected()) + lr; String value = assetList.get(newOne.getSelected()) + lr; if (!key.equals(value)) { potentialUpdates.add(key); pAssetManager.put(key, new AssetInfo(key, value)); } // System.err.println("bUG: "+pAssetManager.get(key).getHiLoResShots()); } } if (!pAssetManager.isEmpty()) return true; } return false; } // end buildReplacementGUI
/** * Get list of each asset to be replaced, and the shots it's in. * * @return * @throws PipelineException */ private boolean getShotsUsingAssets() throws PipelineException { ArrayList<ArchiveInfo> archive = mclient.archiveQuery(shotPattern, null); logLine("Looking for shots using lo-res assets."); for (ArchiveInfo curArc : archive) { String name = curArc.getName(); VersionID vid = curArc.getVersionID(); TreeSet<VersionID> allVers = mclient.getCheckedInVersionIDs(name); if (!vid.equals(allVers.last())) continue; NodeVersion ver = mclient.getCheckedInVersion(name, vid); Set<String> srcs = ver.getSourceNames(); for (String loResAsset : pAssetManager.keySet()) { if (srcs.contains(loResAsset)) { // TODO chec if latest. logLine("\t" + getShortName(loResAsset) + ": " + getShortName(name)); AssetInfo tempInfo = pAssetManager.get(loResAsset); if (!tempInfo.getLoHiResShots().containsKey(name)) tempInfo.getLoHiResShots().put(name, null); } // end if } // end for } // end for logLine("Looking for shots using hi-res assets"); /* - Populate lo-res */ for (ArchiveInfo curArc : archive) { String name = curArc.getName(); VersionID vid = curArc.getVersionID(); TreeSet<VersionID> allVers = mclient.getCheckedInVersionIDs(name); if (!vid.equals(allVers.last())) continue; NodeVersion ver = mclient.getCheckedInVersion(name, vid); Set<String> srcs = ver.getSourceNames(); for (String updateAsset : pAssetManager.keySet()) { String hiResAsset = updateAsset.replace(lr, ""); if (srcs.contains(hiResAsset)) { logLine("\t" + getShortName(hiResAsset) + ": " + getShortName(name)); AssetInfo tempInfo = pAssetManager.get(updateAsset); String loRes = tempInfo.getMatchingLoResShot(name); if (loRes == null) { logLine( "!!!\nWARNING:" + getShortName(hiResAsset) + " is used in the " + getShortName(name) + " node which has no matching lo-res model in an anim node." + " So it will not be changed\n!!!"); continue; } tempInfo.getLoHiResShots().put(loRes, name); } // end if } // end for } // end for(ArchiveInfo) logLine(""); for (String updateAsset : potentialUpdates) { TreeMap<String, String> shots = pAssetManager.get(updateAsset).getLoHiResShots(); if (shots.isEmpty()) { logLine(getShortName(updateAsset) + " is not used in any shots"); pAssetManager.remove(updateAsset); } for (String loRes : shots.keySet()) { if (shots.get(loRes) == null) logLine( getShortName(updateAsset) + " is in a hi-res shot, " + getShortName(loRes) + ", but doesn't have a matching hi-res" + "model in the lgt node."); } } if (pAssetManager.isEmpty()) return false; return true; } // end getShotsUsingAssets
/** * Using a list of shots and the assets to be changed per shot, gets each shot node and modifies * the references as needed. */ private void processNodes() throws PipelineException { /*each asset, its replacement and the lo-res versions*/ for (String asset : pAssetManager.keySet()) { String newAsset = pAssetManager.get(asset).getNewAsset(); String hrAsset = asset.replace(lr, ""); String newHrAsset = newAsset.replace(lr, ""); logLine( "Checking out nodes:\n\t" + asset + "\n\t" + hrAsset + "\n\t" + newAsset + "\n\t" + newHrAsset); mclient.checkOut(w.user, w.view, asset, null, over, froz); mclient.checkOut(w.user, w.view, newAsset, null, over, froz); mclient.checkOut(w.user, w.view, hrAsset, null, over, froz); mclient.checkOut(w.user, w.view, newHrAsset, null, over, froz); } // end for TreeMap<String, TreeSet<String>> shotBased = convertListToShotBased(); TreeMap<String, String> nameMap = SonyConstants.getCustomNamespaces(project); TreeSet<String> oldRef = new TreeSet<String>(); TreeSet<String> newRef = new TreeSet<String>(); for (String shot : shotBased.keySet()) { // check out the shot if (shot.endsWith("anim")) mclient.checkOut(w.user, w.view, shot, null, keep, frozU); else { continue; // mclient.checkOut(w.user, w.view, shot, null, keep, pFroz); } logLine("Checking out: " + shot); NodeMod targetMod = mclient.getWorkingVersion(w.user, w.view, shot); if (!shot.matches(lgtPattern)) { if (targetMod.isActionEnabled()) { System.err.println("Anim node with action enabled"); FileSeq fseq = targetMod.getPrimarySequence(); VersionID targetID = targetMod.getWorkingID(); TreeMap<String, VersionID> files = new TreeMap<String, VersionID>(); files.put(fseq.getFile(0).getPath(), targetID); mclient.revertFiles(w.user, w.view, shot, files); targetMod.setActionEnabled(false); } w.mclient.modifyProperties(w.user, w.view, targetMod); } /*--checking the shot to be modified---*/ for (String assetToReplace : shotBased.get(shot)) { if (assetToReplace.endsWith(lr)) { AssetInfo temp = pAssetManager.get(assetToReplace); oldRef.add(assetToReplace); newRef.add(temp.getNewAsset()); } else { String hiRes = assetToReplace.replace(lr, ""); AssetInfo temp = pAssetManager.get(hiRes); if (temp == null) continue; oldRef.add(assetToReplace); newRef.add(temp.getNewAsset() + lr); } // end else } // end for if (oldRef.isEmpty() || newRef.isEmpty()) { logLine("Shot " + shot + " somehow does not need any changes."); continue; } // end if editShotReferences(shot, targetMod, oldRef, newRef, nameMap); } // end for /*for(String shot: shotBased.keySet()){ //TODO: Check in nodes String msg = "Checked in with UpdateAssetGUI. Removed:\n\t"; for(String asset: oldRef) msg+= (asset + " "); msg+="\nAdded:\n\t"; for(String asset: newRef) msg+= (asset + " "); mclient.checkIn(w.user, w.view,shot, msg, VersionID.Level.Major); }*/ } // end processShots
/** * Phase in which parameter values should be extracted from parameters and checked for * consistency and applicability. */ @Override public void validatePhase() throws PipelineException { /* sets up the built-in parameters common to all builders */ validateBuiltInParams(); /* setup the StudioDefinitions version of the UtilContext */ pStudioDefs.setContext(pContext); /* lookup the source images node */ String sourceNodeName = null; VersionID sourceVersionID = null; { Path spath = (Path) getParamValue(aSourceNode); if (spath == null) throw new PipelineException("No " + aSourceNode + " was specified!"); sourceNodeName = spath.toString(); pSourcePrefix = spath.getName(); String sversion = (String) getParamValue(aSourceVersion); if (sversion == null) throw new PipelineException("No " + aSourceVersion + " was specified!"); try { sourceVersionID = new VersionID(sversion); } catch (Exception ex) { throw new PipelineException( "The value supplied for the " + aSourceVersion + " parameter " + "(" + sversion + ") is not a legal node revision number!\n\n" + ex.getMessage()); } try { pSourceVersion = pClient.getCheckedInVersion(sourceNodeName, sourceVersionID); } catch (PipelineException ex) { throw new PipelineException( "The source images node (" + sourceNodeName + " v" + sourceVersionID + ") " + "does not exist!"); } } /* set namer/builder parameters based on the annotations on the source images node */ { boolean validated = false; String projName = null; String taskName = null; String taskType = null; TreeMap<String, BaseAnnotation> annotations = pClient.getAnnotations(sourceNodeName); TreeSet<String> otherPurposes = new TreeSet<String>(); for (String aname : annotations.keySet()) { if (aname.equals("Task") || aname.startsWith("AltTask")) { BaseAnnotation annot = annotations.get(aname); String purpose = lookupPurpose(sourceNodeName, aname, annot); if (purpose == null) { otherPurposes.add("<UNKNWON>"); } else if (purpose.equals(aFocus) || purpose.equals(aEdit) || purpose.equals(aProduct)) { projName = lookupProjectName(sourceNodeName, aname, annot); taskName = lookupTaskName(sourceNodeName, aname, annot); taskType = lookupTaskType(sourceNodeName, aname, annot); validated = true; break; } else { otherPurposes.add(purpose); } } } if (!validated) { StringBuilder buf = new StringBuilder(); buf.append( "Unable to find an valid " + aEdit + ", " + aFocus + " or " + aProduct + " " + "task annotation for the source images node (" + sourceNodeName + " v" + sourceVersionID + ")!"); if (!otherPurposes.isEmpty()) { buf.append( "\n\nHowever, there were task annotations on the source images node for " + "the following unsupported purposes:"); for (String purpose : otherPurposes) buf.append(" " + purpose); } throw new PipelineException(buf.toString()); } if (taskName.length() != 5) throw new PipelineException( "The " + aTaskName + " (" + taskName + ") of the source images " + "node (" + sourceNodeName + " v" + sourceVersionID + ") did not conform to " + "the 2-letter sequence name followed by 3-digit shot number format!"); pProjectName = projName; pSeqName = taskName.substring(0, 2); pShotName = taskName.substring(2, 5); try { pTaskType = TaskType.valueOf(TaskType.class, taskType); } catch (IllegalArgumentException ex) { throw new PipelineException( "The " + DeliverNamer.aTaskType + " (" + taskType + ") of the source images " + "node (" + sourceNodeName + " v" + sourceVersionID + ") was an unknown type " + "by this builder!"); } } /* generate a temporary working area where the approval process will take place and change the util context to use it instead for all future operations */ { String tempView = ("QtDeliver" + "-" + pProjectName + "-" + pSeqName + pShotName + "-" + pSourcePrefix); tempView = tempView.replaceAll(" ", "_"); setContext(new UtilContext(pContext.getAuthor(), tempView, pContext.getToolset())); } /* turn on the DoAnnotations flag for the StageInformation shared by all of the Stages created by this builder since we always want task annotations */ getStageInformation().setDoAnnotations(true); /* initialize internal Project namer */ { pProjectNamer.setParamValue(new ParamMapping(StudioDefinitions.aProjectName), pProjectName); pProjectNamer.generateNames(); } }
/** Add the UI components for the given file sequence to the panel. */ private void addFileSeqPanel(FileSeq fseq) { boolean isPresentInWorking = false; if ((pStatus != null) && pStatus.hasLightDetails()) { NodeDetailsLight details = pStatus.getLightDetails(); NodeMod mod = details.getWorkingVersion(); if (mod != null) { if (mod.getPrimarySequence().equals(fseq)) isPresentInWorking = true; else { for (FileSeq sfseq : mod.getSecondarySequences()) { if (sfseq.equals(fseq)) { isPresentInWorking = true; break; } } } } } /* collate the row information */ ArrayList<VersionID> vids = new ArrayList<VersionID>(); ArrayList<FileSeq> singles = new ArrayList<FileSeq>(); TreeSet<FileSeq> enabled = new TreeSet<FileSeq>(); TreeMap<FileSeq, FileState> fstates = new TreeMap<FileSeq, FileState>(); TreeMap<FileSeq, NativeFileInfo> finfos = new TreeMap<FileSeq, NativeFileInfo>(); TreeMap<FileSeq, QueueState> qstates = new TreeMap<FileSeq, QueueState>(); TreeMap<FileSeq, Boolean[]> novel = new TreeMap<FileSeq, Boolean[]>(); { TreeMap<FileSeq, Integer> wsingles = new TreeMap<FileSeq, Integer>(); if ((pStatus != null) && pStatus.hasLightDetails()) { if (isPresentInWorking) { if (pStatus.hasHeavyDetails()) { NodeDetailsHeavy details = pStatus.getHeavyDetails(); FileState[] fs = details.getFileStates(fseq); QueueState[] qs = details.getQueueStates(); NativeFileInfo[] infos = details.getFileInfos(fseq); if ((fs != null) && (qs != null) && (infos != null)) { int wk; for (wk = 0; wk < fs.length; wk++) { FileSeq sfseq = new FileSeq(fseq, wk); wsingles.put(sfseq, wk); fstates.put(sfseq, fs[wk]); finfos.put(sfseq, infos[wk]); qstates.put(sfseq, qs[wk]); if (fs[wk] != FileState.CheckedIn) enabled.add(sfseq); } } } else { NodeDetailsLight details = pStatus.getLightDetails(); int wk; for (wk = 0; wk < fseq.numFrames(); wk++) { FileSeq sfseq = new FileSeq(fseq, wk); wsingles.put(sfseq, wk); if (details.getVersionState() == VersionState.CheckedIn) { fstates.put(sfseq, FileState.CheckedIn); qstates.put(sfseq, QueueState.Undefined); } else { enabled.add(sfseq); } } } } { vids.addAll(pNovelty.keySet()); Collections.reverse(vids); int idx = 0; for (VersionID vid : vids) { TreeMap<FileSeq, boolean[]> table = pNovelty.get(vid); for (FileSeq nfseq : table.keySet()) { if (fseq.similarTo(nfseq)) { boolean[] flags = table.get(nfseq); int wk; for (wk = 0; wk < flags.length; wk++) { FileSeq sfseq = new FileSeq(nfseq, wk); if (!wsingles.containsKey(sfseq)) wsingles.put(sfseq, null); Boolean[] rflags = novel.get(sfseq); if (rflags == null) { rflags = new Boolean[pNovelty.size()]; novel.put(sfseq, rflags); } rflags[idx] = new Boolean(flags[wk]); } break; } } idx++; } } } TreeMap<Integer, FileSeq> order = new TreeMap<Integer, FileSeq>(); for (FileSeq sfseq : wsingles.keySet()) { int frame = -1; if (sfseq.hasFrameNumbers()) frame = sfseq.getFrameRange().getStart(); order.put(frame, sfseq); } singles.addAll(order.values()); } /* add the panel */ { JFileSeqPanel panel = new JFileSeqPanel( this, pManagerPanel, pStatus, pPrivilegeDetails, fseq, vids, pOffline, singles, fstates, finfos, qstates, enabled, novel, pIsListLayout); if (pIsListLayout) pFileSeqsBox.add(panel); else pFileSeqsTab.addTab(fseq.getFilePattern().toString(), sTabIcon, panel); pFileSeqPanels.put(fseq, panel); } }
/** * Update the UI components to reflect the current per-file status. * * @param status The current node status. * @param novelty The per-file novelty flags. * @param offline The revision numbers of the offline checked-in versions. */ protected synchronized void updateNodeStatus( NodeStatus status, TreeMap<VersionID, TreeMap<FileSeq, boolean[]>> novelty, TreeSet<VersionID> offline) { super.updateNodeStatus(status, false); pNovelty = novelty; pOffline = offline; NodeDetailsLight details = null; if (pStatus != null) details = pStatus.getLightDetails(); /* files */ { pFileSeqsTab.removeAll(); pFileSeqsBox.removeAll(); pFileSeqPanels.clear(); if ((pNovelty != null) && (details != null)) { NodeMod mod = details.getWorkingVersion(); NodeVersion vsn = details.getLatestVersion(); NodeCommon com = null; if (mod != null) com = mod; else if (vsn != null) com = vsn; else assert (false); /* get the primary and unique secondary file sequences */ FileSeq primary = com.getPrimarySequence(); TreeSet<FileSeq> secondary = new TreeSet<FileSeq>(); { secondary.addAll(com.getSecondarySequences()); TreeSet<FileSeq> unique = new TreeSet<FileSeq>(); for (TreeMap<FileSeq, boolean[]> table : pNovelty.values()) unique.addAll(table.keySet()); for (FileSeq ufseq : unique) { boolean found = false; if (ufseq.similarTo(primary)) found = true; else { for (FileSeq fseq : secondary) { if (ufseq.similarTo(fseq)) { found = true; break; } } } if (!found) secondary.add(ufseq); } } /* add the file sequence UI components */ addFileSeqPanel(primary); for (FileSeq fseq : secondary) addFileSeqPanel(fseq); if (pIsListLayout) pFileSeqsBox.add(UIFactory.createFiller(sSize)); } } pFileSeqsTab.setVisible(!pIsListLayout); pFileSeqsScroll.setVisible(pIsListLayout); if (pIsListLayout) pFileSeqsScroll.revalidate(); else pFileSeqsTab.revalidate(); }