import java.awt.*; import java.util.*; class AmCaret { // tekstikursor AmSymbol sy; // symboli atribuutide jaoks AmSketch parent; // kursorit holmav la"him skeem AmText parentText; // tekst, millel asub; null, kui on kommentaaril AmRow row; // rida, millel asub int syNo;// symboli nr., mille ja"rel reas asub (-1, kui rea alguses) int shift; // kaugus pikselites rea algusest AmHead parentHead; // el-pais, millel asub AmNonSketch parentPrimitive; // primitiiv, millel asub // parentHead == null && parentPrimitive == null : on skeemikommentaaril Color color; // kursori varv, kustutamiseks - Skm.backgroundColor AmCaret(){//konstruktor sy = new AmSymbol('x', AmFont.font[0], AmDefault.foregroundColor); color = AmDefault.caretColor; parent = null; parentText = null; row = null; syNo = -1; shift = 0; parentHead = null; parentPrimitive = null; }//konstruktor public boolean onSketchComment(){ return (parentText == null && parentHead == null && parentPrimitive == null); } public AmCaret makeCopy(){ AmCaret dest = new AmCaret(); dest.sy = sy; dest.parent = parent; dest.parentText = parentText; dest.row = row; dest.parentHead = parentHead; dest.parentPrimitive = parentPrimitive; dest.syNo = syNo; dest.shift = shift; dest.color = color; return dest; } void unpaint(){ Color keep = color; color = AmDefault.backgroundColor; Am.canvas.repaint(row.x+shift, row.y, 1, row.height //- SkmRow.ROW_ADVANCE ); color = keep; } void paint(){// parast uude kohta viimist Am.canvas.repaint(row.x+shift, row.y, 1, row.height //- SkmRow.ROW_ADVANCE ); } /* void moveSketchHome(){//skeemijoone algusse unpaint(); // kustutada sealt, kus oli setLocation(parent, null, parent.comment, -1); shift = 0; }//moveHome(SkmSketch sk) */ /* void moveEnd(SkmSketch sk){//skeemijoone ja endcomment loppu SkmRepaint.unpaintCaret(); // kustutada sealt, kus oli setLocation(sk, -1, 0, -1, -1, null, sk.endcomment, -1); Skm.caret.shift = 0; }//moveHome(SkmSketch sk) */ void moveRight(){// reas int n = row.rowelem.size(); if((n>0) && (syNo < n-1)){ // rida pole tyhi ja kursor ei asu viimase sy ees unpaint(); // kustutada sealt, kus oli syNo++; // lihtsalt edasi setShift();// saaks kiiremini, sy laiuse jargi paint(); } }//moveRight() void moveLeft(){// reas vasakule if(syNo > -1){ //kursor ei asu esimese sy ees unpaint(); // kustutada sealt, kus oli syNo--; // lihtsalt tagasi setShift();// saaks kiiremini, sy laiuse jargi paint(); } }//moveLeft() void moveUp(){// yles if(parentText != null){ // on tekstil int rowNo = parentText.rows.indexOf(row); if (rowNo > 0){// ei olnud texti esimesel real // eelmisele reale unpaint(); // kustutada sealt, kus oli // uus rida: row = (AmRow)(parentText.rows.elementAt(rowNo-1)); if(syNo > row.rowelem.size()-1) syNo = row.rowelem.size()-1; setShift(); paint(); } else{// oli teksti esimesel real // minna eelmisele objektile if(parentHead != null){ // oli el-paisel int elHeadNo = parent.head.indexOf(parentHead); if(elHeadNo != 0){// ei olnud esimesel el-paisel // eelmisele el-paisele unpaint(); // kustutada sealt, kus oli // uuele paisele parentText = (AmText)(parent.head.elementAt(elHeadNo-1)); // uue paise viimasele reale rowNo = parentText.rows.size() - 1; row = (AmRow)(parentText.rows.elementAt(rowNo)); if(syNo > row.rowelem.size()-1) syNo = row.rowelem.size()-1; setShift(); paint(); } else{// oli esimesel paisel // minna skeemi kommentaarile unpaint(); // kustutada sealt, kus oli parentText = null; parentHead = null; row = parent.comment; if(syNo > row.rowelem.size()-1) syNo = row.rowelem.size()-1; setShift(); paint(); } }// kui oli el-paisel else{// polnud el-paisel // oli primitiivil }// polnud el-paisel }//else }// kui oli tekstil else{// oli kommentaaril //kas primitiivil? if(parentPrimitive != null){ // ... } else{ // kas skeemikommentaaril? if(parentHead == null){ // skeemikommentaaril // minna eelmise skeemi eelmise liikme loppu AmSketch prev = parent.parent; }// skeemikommentaaril else{// paisekommentaaril }// paisekommentaaaril }// kas skeemikommentaaril? }// oli kommentaaril }//moveUp() void moveDown(){// alla // int n = row.rowelem.size(); if(parentText != null){ // on tekstil int rowNo = parentText.rows.indexOf(row); if (rowNo < parentText.rows.size()-1){// ei olnud texti viimasel real // viimasele reale unpaint(); // kustutada sealt, kus oli // uus rida: row = (AmRow)(parentText.rows.elementAt(rowNo+1)); if(syNo > row.rowelem.size()-1) syNo = row.rowelem.size()-1; setShift(); paint(); } else{// oli teksti viimasel real // minna eelmisele objektile // kas see on paise tekst? if(parentHead != null){ // oli el-paisel int elHeadNo = parent.head.indexOf(parentHead); if(elHeadNo != 0){// ei olnud esimesel el-paisel // eelmisele el-paisele unpaint(); // kustutada sealt, kus oli // uuele paisele parentText = (AmText)(parent.head.elementAt(elHeadNo-1)); // uue paise viimasele reale rowNo = parentText.rows.size() - 1; row = (AmRow)(parentText.rows.elementAt(rowNo)); if(syNo > row.rowelem.size()-1) syNo = row.rowelem.size()-1; setShift(); paint(); } else{// oli esimesel paisel // minna skeemi kommentaarile unpaint(); // kustutada sealt, kus oli parentText = null; parentHead = null; row = parent.comment; if(syNo > row.rowelem.size()-1) syNo = row.rowelem.size()-1; setShift(); paint(); } }// kui oli el-paisel else{// polnud el-paisel // oli primitiivil }// polnud el-paisel }//else }// kui oli tekstil else{// oli kommentaaril //kas primitiivil? if(parentPrimitive != null){ // ... } else{ // kas skeemikommentaaril? if(parentHead == null){ // skeemikommentaaril if(parent.head.size() != 0){ // minna paisele unpaint(); // kustutada sealt, kus oli parentHead = (AmHead)(parent.head.elementAt(0)); parentPrimitive = null; parentText = parentHead.text; row = (AmRow)(parentText.rows.elementAt(0)); if(syNo > row.rowelem.size()-1) syNo = row.rowelem.size()-1; setShift(); paint(); }else // minna skeemi esimesele liikmele {} }// skeemikommentaaril else{// paisekommentaaril }// paisekommentaaaril }// kas skeemikommentaaril? }// oli kommentaaril }//moveDown() public void moveInRowToMouse(Point mouseCoord){// Skm.ccaret jaoks // eeldus: hiir on real (row); syNo - kust alustada liikumist // tulemus: syNo int i; if(parentText == null)// kommentaaril sy = new AmSymbol('x', AmDefault.font, AmDefault.commentColor); else // mittekommentaaril sy = new AmSymbol('x', AmDefault.font, AmDefault.foregroundColor); syNo = -1; shift = 0; if(row.rowelem.size() > 0){ int xx = mouseCoord.x - row.x; // suhteline hiire x for(i=0; xx > shift; syNo++, i++){ shift += ((AmSymbol)(row.rowelem.elementAt(i))).width(); } shift -= ((AmSymbol)(row.rowelem.elementAt(i-1))).width(); syNo--; // atribuutide omistamine sy = (AmSymbol)(row.rowelem.elementAt(i)); }//if } public void moveTo(AmSketch s){//antud skeemi kommentaari algusse unpaint(); // kustutada sealt, kus oli AmCaret c = new AmCaret(); c.parent = s; c.row = s.comment; if(parent.comment.rowelem.size() > 0) c.sy = (AmSymbol)(parent.comment.rowelem.elementAt(0)); // praegu ei ole AmImage jaoks tehtud Am.caret = c.makeCopy(); Am.caret.paint(); }//moveToSketch(AmSketch s) public void moveTo(AmCaret cc){ // eeldus: cc on seatud uude kohta unpaint(); // kustutada sealt, kus oli // kopeerida: Am.caret = cc.makeCopy(); paint(); }//moveTo(AmCaret) public void moveTo(AmSketch s, AmHead hh){//antud el-paise algusse unpaint(); // kustutada sealt, kus oli AmCaret c = new AmCaret(); c.parent = s; c.row = (AmRow)(hh.text.rows.elementAt(0)); c.parentHead = hh; if(c.row.rowelem.size() > 0) c.sy = (AmSymbol)(c.row.rowelem.elementAt(0)); // praegu ei ole AmImage jaoks tehtud Am.caret = c.makeCopy(); Am.caret.paint(); }//moveToSketch(AmSketch s) void setShift(){// rea algusest kuni selle symbolini (v.a.) shift = 0; // rea algusse if(syNo != -1){// arvutada x-nihe int i = 0; for(Enumeration e = row.rowelem.elements(); e.hasMoreElements() && i <= syNo; i++){ shift += ((AmSymbol)(e.nextElement())).width(); } } } void draw(Graphics g){ g.setColor(AmDefault.textframeColor); if(parentText == null) g.drawRect(row.x,row.y,row.width, row.height); else g.drawRect(parentText.x,parentText.y,parentText.width, parentText.height); g.setColor(AmDefault.caretColor); g.drawLine(row.x+shift,row.y, row.x+shift,(row.y+row.height)); // toimetamisvo~imalused: if(onSketchComment()) AmMenu.setEnabled(Am.mb, "Insert", true); else AmMenu.setEnabled(Am.mb, "Insert", false); }//draw() }