/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: AddFlagAnnotationJob.java * * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. * * 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.generator.flag; import com.sun.electric.database.hierarchy.Cell; import com.sun.electric.database.network.NetworkTool; import com.sun.electric.database.variable.EditWindow_; import com.sun.electric.database.variable.TextDescriptor; import com.sun.electric.database.variable.UserInterface; import com.sun.electric.database.variable.Variable; import com.sun.electric.tool.Job; import com.sun.electric.tool.JobException; public class AddFlagAnnotationJob extends Job { static final long serialVersionUID = 0; private transient EditWindow_ wnd; private Cell cell; private String newAnnotation; private AddFlagAnnotationJob(EditWindow_ wnd, Cell cell, String annotation) { super("Make Flag Annotation", NetworkTool.getNetworkTool(), Job.Type.CHANGE, null, null, Job.Priority.USER); this.wnd = wnd; this.cell = cell; newAnnotation = annotation; startJob(); } public boolean doIt() throws JobException { Variable plaidVar = cell.getVar(FlagAnnotations.FLAG_ANNOTATION_KEY); if (plaidVar == null) { String [] initial = new String[1]; initial[0] = newAnnotation; TextDescriptor td = TextDescriptor.getCellTextDescriptor().withInterior(true).withDispPart(TextDescriptor.DispPos.NAMEVALUE); plaidVar = cell.newVar(FlagAnnotations.FLAG_ANNOTATION_KEY, initial, td); if (plaidVar == null) return true; } else { Object oldObj = plaidVar.getObject(); if (oldObj instanceof String) { /* Groan! Menu command always creates PLAID attributes as arrays of strings. * However, if user edits a single line PLAID attribute then dialog box * converts it back into a String. Be prepared to convert it back into an array*/ oldObj = new String[] {(String)oldObj}; } error(!(oldObj instanceof String[]), "PLAID annotation not String[]"); String[] oldVal = (String[]) oldObj; TextDescriptor td = plaidVar.getTextDescriptor(); int newLen = oldVal.length+1; String[] newVal = new String[newLen]; for (int i=0; i<newLen-1; i++) newVal[i]=oldVal[i]; newVal[newLen-1] = newAnnotation; plaidVar = cell.newVar(FlagAnnotations.FLAG_ANNOTATION_KEY, newVal, td); } return true; } public void terminateOK() { wnd.clearHighlighting(); wnd.addHighlightText(cell, cell, FlagAnnotations.FLAG_ANNOTATION_KEY); wnd.finishedHighlighting(); } /** Method to create NCC annotations in the current Cell. * Called from the menu commands. */ public static void makeCellAnnotation(String newAnnotation) { UserInterface ui = Job.getUserInterface(); EditWindow_ wnd = ui.needCurrentEditWindow_(); if (wnd == null) return; Cell cell = ui.needCurrentCell(); if (cell == null) return; new AddFlagAnnotationJob(wnd, cell, newAnnotation); } }