/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: ComponentMenuTab.java * * Copyright (c) 2007 Sun Microsystems and Static Free Software * * Electric(tm) is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Electric(tm) 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 for more details. * * You should have received a copy of the GNU General Public License * along with Electric(tm); see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, Mass 02111-1307, USA. */ package com.sun.electric.tool.user.dialogs.options; import com.sun.electric.technology.ArcProto; import com.sun.electric.technology.PrimitiveNode; import com.sun.electric.technology.PrimitiveNodeGroup; import com.sun.electric.technology.Technology; import com.sun.electric.technology.Xml; import com.sun.electric.tool.user.dialogs.ComponentMenu; import com.sun.electric.tool.user.ui.WindowFrame; import java.awt.Frame; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; import javax.swing.JPanel; /** * Class to handle the "Component Menu" tab of the preferences dialog. */ public class ComponentMenuTab extends PreferencePanel { private ComponentMenu theMenu; private Technology tech; /** Creates new form ComponentMenu */ public ComponentMenuTab(Frame parent, boolean modal) { super(parent, modal); theMenu = new ComponentMenu(parent, false); } /** return the panel to use for the user preferences. */ public JPanel getUserPreferencesPanel() { return theMenu.getPanel(); } /** return the name of this preferences tab. */ public String getName() { return "Component Menu"; } /** * Method called at the start of the dialog. */ public void init() { tech = Technology.getCurrent(); // make an XML technology to correspond with this one Xml.Technology xTech = new Xml.Technology(); for(Iterator<ArcProto> it = tech.getArcs(); it.hasNext(); ) { ArcProto ap = it.next(); Xml.ArcProto curArc = new Xml.ArcProto(); curArc.name = ap.getName(); xTech.arcs.add(curArc); } HashSet<PrimitiveNodeGroup> groupsDone = new HashSet<PrimitiveNodeGroup>(); for (Iterator<PrimitiveNode> it = tech.getNodes(); it.hasNext(); ) { PrimitiveNode pnp = it.next(); if (pnp.getFunction() == PrimitiveNode.Function.NODE) continue; PrimitiveNodeGroup group = pnp.getPrimitiveNodeGroup(); if (group != null) { if (groupsDone.contains(group)) continue; Xml.PrimitiveNodeGroup ng = new Xml.PrimitiveNodeGroup(); for (PrimitiveNode pn: group.getNodes()) { Xml.PrimitiveNode n = new Xml.PrimitiveNode(); n.name = pn.getName(); ng.nodes.add(n); } xTech.nodeGroups.add(ng); groupsDone.add(group); } else { Xml.PrimitiveNodeGroup ng = new Xml.PrimitiveNodeGroup(); ng.isSingleton = true; Xml.PrimitiveNode n = new Xml.PrimitiveNode(); n.name = pnp.getName(); ng.nodes.add(n); xTech.nodeGroups.add(ng); } } // build a set of XML objects that refer to this XML technology Object[][] menuArray = makeMenuArray(ComponentMenu.getMenuPalette(tech)); Object[][] defMenuArray = makeMenuArray(tech.getFactoryMenuPalette()); theMenu.showTechnology(tech.getTechName(), xTech, menuArray, defMenuArray); } private Object[][] makeMenuArray(Xml.MenuPalette curMenu) { int menuWid = curMenu.numColumns; int menuHei = (curMenu.menuBoxes.size() + menuWid - 1)/menuWid; Object[][] menuArray = new Object[menuHei][menuWid]; for(int y=0; y<menuHei; y++) { for(int x=0; x<menuWid; x++) { int index = y*menuWid + x; List<?> menuBoxList = index < curMenu.menuBoxes.size() ? curMenu.menuBoxes.get(index) : null; if (menuBoxList == null || menuBoxList.isEmpty()) continue; menuArray[y][x] = menuBoxList.size() > 1 ? new ArrayList<Object>(menuBoxList) : menuBoxList.get(0); } } return menuArray; } /** * Method called when the "OK" panel is hit. * Updates any changed fields in the tab. */ public void term() { if (!theMenu.isChanged()) return; Xml.MenuPalette xmp = new Xml.MenuPalette(); Object[][] menuArray = theMenu.getMenuInfo(); int menuHei = menuArray.length; int menuWid = menuArray[0].length; xmp.numColumns = menuWid; xmp.menuBoxes = new ArrayList<List<?>>(); for(int y=0; y<menuHei; y++) { for(int x=0; x<menuWid; x++) { Object item = null; if (menuArray[y] != null) item = menuArray[y][x]; if (item instanceof List) { xmp.menuBoxes.add((List)item); } else { List<Object> subList = new ArrayList<Object>(); if (item != null) subList.add(item); xmp.menuBoxes.add(subList); } } } ComponentMenu.ComponentMenuPreferences cmp = new ComponentMenu.ComponentMenuPreferences(false); cmp.menuXmls.put(tech, xmp.writeXml()); putPrefs(cmp); for(Iterator<WindowFrame> it = WindowFrame.getWindows(); it.hasNext(); ) { WindowFrame wf = it.next(); wf.getPaletteTab().loadForTechnology(tech, wf); } } /** * Method called when the factory reset is requested for just this panel. * @return true if the panel can be reset "in place" without redisplay. */ public boolean resetThis() { theMenu.factoryReset(); return true; } /** * Method called when the factory reset is requested. */ public void reset() { if (tech == null) return; // nothing to reset since the dialog hasn't been used. ComponentMenu.ComponentMenuPreferences cmp = new ComponentMenu.ComponentMenuPreferences(true); putPrefs(cmp); for(Iterator<WindowFrame> it = WindowFrame.getWindows(); it.hasNext(); ) { WindowFrame wf = it.next(); wf.getPaletteTab().loadForTechnology(tech, wf); } } }