001: /*
002: * VHDLMode.java
003: *
004: * Copyright (C) 2002 Peter Graves
005: * $Id: VHDLMode.java,v 1.1.1.1 2002/09/24 16:08:58 piso Exp $
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License
009: * as published by the Free Software Foundation; either version 2
010: * of the License, or (at your option) any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU General Public License for more details.
016: *
017: * You should have received a copy of the GNU General Public License
018: * along with this program; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
020: */
021:
022: package org.armedbear.j;
023:
024: import gnu.regexp.RE;
025: import gnu.regexp.UncheckedRE;
026: import java.awt.event.KeyEvent;
027:
028: public final class VHDLMode extends AbstractMode implements Constants,
029: Mode {
030: private static final VHDLMode mode = new VHDLMode();
031:
032: private VHDLMode() {
033: super (VHDL_MODE, VHDL_MODE_NAME);
034: keywords = new Keywords(this );
035: }
036:
037: public static VHDLMode getMode() {
038: return mode;
039: }
040:
041: public String getCommentStart() {
042: return "-- ";
043: }
044:
045: public Formatter getFormatter(Buffer buffer) {
046: return new VHDLFormatter(buffer);
047: }
048:
049: public boolean isKeyword(String s) {
050: return keywords.isKeyword(s.toLowerCase());
051: }
052:
053: protected void setKeyMapDefaults(KeyMap km) {
054: km.mapKey(KeyEvent.VK_ENTER, 0, "newlineAndIndent");
055: km.mapKey(KeyEvent.VK_T, CTRL_MASK, "findTag");
056: km.mapKey(KeyEvent.VK_PERIOD, ALT_MASK, "findTagAtDot");
057: km.mapKey(KeyEvent.VK_F12, 0, "wrapComment");
058: // Duplicate mapping to support IBM 1.3 for Linux.
059: km.mapKey(0xffc9, 0, "wrapComment"); // F12
060: }
061:
062: public boolean isTaggable() {
063: return true;
064: }
065:
066: public Tagger getTagger(SystemBuffer buffer) {
067: return new VHDLTagger(buffer);
068: }
069:
070: public boolean canIndent() {
071: return true;
072: }
073:
074: public boolean canIndentPaste() {
075: return false;
076: }
077:
078: private static final RE beginRE = new UncheckedRE("^begin\\s");
079: private static final RE thenRE = new UncheckedRE("\\s+then$");
080: private static final RE loopRE = new UncheckedRE("\\s+loop$");
081:
082: public int getCorrectIndentation(Line line, Buffer buffer) {
083: final int indentSize = buffer.getIndentSize();
084: final Line model = findModel(line);
085: if (model == null)
086: return 0;
087: final int modelIndent = buffer.getIndentation(model);
088: final String modelTrim = trimSyntacticWhitespace(model);
089:
090: if (modelTrim.equals("begin")
091: || beginRE.getMatch(modelTrim) != null) {
092: // Model starts with "begin".
093: return modelIndent + indentSize;
094: }
095: if (modelTrim.equals("then")
096: || thenRE.getMatch(modelTrim) != null) {
097: // Model ends with "then".
098: return modelIndent + indentSize;
099: }
100: if (modelTrim.equals("loop")
101: || loopRE.getMatch(modelTrim) != null) {
102: // Model ends with "loop".
103: return modelIndent + indentSize;
104: }
105:
106: return modelIndent;
107: }
108:
109: private Line findModel(Line line) {
110: Line model = line.previous();
111: while (model != null && model.isBlank())
112: model = model.previous();
113: return model;
114: }
115:
116: // Replaces syntactic whitespace (quotes and comments) with actual space
117: // characters and returns trimmed string.
118: private static String trimSyntacticWhitespace(Line line) {
119: VHDLSyntaxIterator it = new VHDLSyntaxIterator(null);
120: return new String(it.hideSyntacticWhitespace(line.getText()))
121: .trim();
122: }
123:
124: public boolean isIdentifierStart(char c) {
125: return startChars.indexOf(c) >= 0;
126: }
127:
128: public boolean isIdentifierPart(char c) {
129: return partChars.indexOf(c) >= 0;
130: }
131:
132: private static final String startChars = "`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
133:
134: private static final String partChars = "`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_";
135: }
|