Example #1
0
        /// <summary>
        /// <ja>指定位置に指定された数だけの半角スペースを挿入します。</ja>
        /// <en>The half angle space only of the number specified for a specified position is inserted. </en>
        /// </summary>
        /// <param name="start"><ja>削除する開始位置</ja><en>Start position</en></param>
        /// <param name="count"><ja>挿入する半角スペースの数</ja><en>Count space to insert</en></param>
        /// <param name="dec"><ja>空白領域のテキスト装飾</ja><en>text decoration for the new empty spaces</en></param>
        public void InsertBlanks(int start, int count, TextDecoration dec)
        {
            TextDecoration fillDec = dec;

            if (fillDec != null)
            {
                fillDec = fillDec.RetainBackColor();
                if (fillDec.IsDefault)
                {
                    fillDec = null;
                }
            }
            for (int i = _text.Length - 1; i >= _caretColumn; i--)
            {
                int j = i - count;
                if (j >= _caretColumn)
                {
                    _text[i]  = _text[j];
                    _attrs[i] = _attrs[j];
                }
                else
                {
                    _text[i]  = ' ';
                    _attrs[i] = new CharAttr(fillDec, CharGroup.LatinHankaku);
                }
            }
        }
Example #2
0
        /// 引数と同じ内容で初期化する。lineの内容は破壊されない。
        /// 引数がnullのときは引数なしのコンストラクタと同じ結果になる。
        /// <summary>
        /// <ja>
        /// 引数と同じ内容で初期化します。
        /// </ja>
        /// <en>
        /// Initialize same as argument.
        /// </en>
        /// </summary>
        /// <param name="cc">
        /// <ja>
        /// 設定するキャレット位置
        /// </ja>
        /// <en>
        /// The caret position to set.
        /// </en>
        /// </param>
        /// <param name="line">
        /// <ja>コピー元となるGLineオブジェクト</ja>
        /// <en>GLine object that becomes copy origin</en>
        /// </param>
        /// <remarks>
        /// <ja>
        /// <paramref name="line"/>がnullのときには、引数なしのコンストラクタと同じ結果になります。
        /// </ja>
        /// <en>
        /// The same results with the constructor who doesn't have the argument when <paramref name="line"/> is null.
        /// </en>
        /// </remarks>
        public void Load(GLine line, int cc)
        {
            if (line == null)   //これがnullになっているとしか思えないクラッシュレポートがあった。本来はないはずなんだが...
            {
                Clear(80);
                return;
            }

            Clear(line.Length);
            GWord w = line.FirstWord;

            _text = line.DuplicateBuffer(_text);

            int n = 0;

            while (w != null)
            {
                int nextoffset = line.GetNextOffset(w);
                while (n < nextoffset)
                {
                    _attrs[n++] = new CharAttr(w.Decoration, w.CharGroup);
                }
                w = w.Next;
            }

            _eolType = line.EOLType;
            ExpandBuffer(cc + 1);
            this.CaretColumn = cc; //' 'で埋めることもあるのでプロパティセットを使う
        }
Example #3
0
    //得到某一个属性的最终值
    public virtual float GetFinalAttr(CharAttr attrName)
    {
        switch (attrName)
        {
        case CharAttr.Hp:
            return(GetAttr(CharAttr.Hp) * (1 + GetAttr(CharAttr.HpPer)));

        case CharAttr.HpMax:
            return(GetAttr(CharAttr.HpMax) * (1 + GetAttr(CharAttr.HpMaxPer)));

        case CharAttr.AttackTime:
            int attackSpeed = GetAttr(CharAttr.AttackSpeed);
            return((attackSpeed == 0) ? 0 : (1.0f / (attackSpeed * (1 + GetAttr(CharAttr.AttackSpeedPer)))));

        case CharAttr.AttackSpeed:
            return(GetAttr(CharAttr.AttackSpeed) * (1 + GetAttr(CharAttr.AttackSpeedPer)));

        case CharAttr.AttackDamage:
            return(GetAttr(CharAttr.AttackDamage) * (1 + GetAttr(CharAttr.AttackDamagePer)));

        case CharAttr.Speed:
            return(GetAttr(CharAttr.Speed) * (1 + GetAttr(CharAttr.SpeedPer)));

        default:
            break;
        }
        return(GetAttr(attrName));
    }
Example #4
0
    public void ChangeProtoAttr(object[] param)
    {
        CharAttr attrName = (CharAttr)param[1];
        int      attrNum  = (int)param[2];

        ChangeAttr(attrName, attrNum);
    }
    void SetAttribute(CharAttr eAttr, int nVal)
    {
        switch (eAttr)
        {
        case CharAttr.ePhysical:
            ProPhysical.sliderValue = nVal / (float)nPhysicalUpperLimit;
            LabPhysical.text        = nVal.ToString() + "/" + nPhysicalUpperLimit.ToString();
            break;

        case CharAttr.eEndurance:
            ProEndurance.sliderValue = nVal / (float)nEnduranceUpperLimit;
            LabEndurance.text        = nVal.ToString() + "/" + nEnduranceUpperLimit.ToString();
            break;

        case CharAttr.eCharm:
            ProCharm.sliderValue = nVal / (float)nCharmUpperLimit;
            LabCharm.text        = nVal.ToString() + "/" + nCharmUpperLimit.ToString();
            break;

        case CharAttr.eTechnique:
            ProTechnique.sliderValue = nVal / (float)nTechniqueUpperLimit;
            LabTechnique.text        = nVal.ToString() + "/" + nTechniqueUpperLimit.ToString();
            break;
        }
    }
Example #6
0
 /// <summary>
 /// Converts character attribute to inner string.
 /// </summary>
 /// <param name="attr">Character attribute</param>
 /// <returns></returns>
 public static string CharAttr2Str(CharAttr attr)
 {
     if (_attr2StrMap.TryGetValue(attr, out string str))
     {
         return(str);
     }
     return(null);
 }
Example #7
0
        /// <summary>
        /// <ja>
        /// データをエクスポートします。
        /// </ja>
        /// <en>
        /// Export the data.
        /// </en>
        /// </summary>
        /// <returns><ja>エクスポートされたGLineオブジェクト</ja><en>Exported GLine object</en></returns>
        public GLine Export()
        {
            GWord firstWord;
            GWord lastWord;

            CharAttr firstAttr = _attrs[0];

            if (firstAttr.Decoration == null)
            {
                firstAttr.Decoration = TextDecoration.Default;
            }
            firstWord = lastWord = new GWord(firstAttr.Decoration, 0, firstAttr.CharGroup);

            int limit = _text.Length;
            int offset;

            if (_text[0] == '\0')
            {
                offset = 0;
            }
            else
            {
                CharAttr prevAttr = firstAttr;
                for (offset = 1; offset < limit; offset++)
                {
                    char ch = _text[offset];
                    if (ch == '\0')
                    {
                        break;
                    }
                    else if (ch == GLine.WIDECHAR_PAD)
                    {
                        continue;
                    }

                    CharAttr attr = _attrs[offset];
                    if (attr.Decoration != prevAttr.Decoration || attr.CharGroup != prevAttr.CharGroup)
                    {
                        if (attr.Decoration == null)
                        {
                            attr.Decoration = TextDecoration.Default;
                        }
                        GWord w = new GWord(attr.Decoration, offset, attr.CharGroup);
                        lastWord.Next = w;
                        lastWord      = w;
                        prevAttr      = attr;
                    }
                }
            }

            GLine line = new GLine((char[])_text.Clone(), offset, firstWord);

            line.EOLType = _eolType;
            return(line);
        }
Example #8
0
    //得到某一个属性基础值
    public virtual int GetAttr(CharAttr attrName)
    {
        int temp = (int)attrName;

        if (attrList.ContainsKey(temp))
        {
            return(attrList[temp]);
        }
        else
        {
            return(-1);
        }
    }
Example #9
0
    //设置某个属性值
    public void SetAttr(CharAttr attrName, int attrNum)
    {
        int temp = (int)attrName;

        if (attrList.ContainsKey(temp))
        {
            attrList[temp] = attrNum;
        }
        else
        {
            attrList.Add(temp, attrNum);
        }
    }
Example #10
0
    //改变某个属性
    public virtual bool ChangeAttr(CharAttr attrName, int changeNum)
    {
        int temp = (int)attrName;

        if (attrList.ContainsKey(temp))
        {
            attrList[temp] += changeNum;
            return(true);
        }
        else
        {
            return(false);
        }
    }
Example #11
0
    //改变某个属性
    public virtual bool ChangeAttr(CharAttr attrName, int changeNum)
    {
        int temp = (int)attrName;

        if (attrList.ContainsKey(temp))
        {
            attrList[temp] += changeNum;
            this.eventDispatcher.Broadcast("ChangeProtoAttr", attrName, changeNum);
            return(true);
        }
        else
        {
            return(false);
        }
    }
Example #12
0
 // 全内容を破棄する
 /// <summary>
 /// <ja>
 /// 保持しているテキストをクリアします。
 /// </ja>
 /// <en>
 /// Clear the held text.
 /// </en>
 /// </summary>
 /// <param name="length"><ja>クリアする長さ</ja><en>Length to clear</en></param>
 public void Clear(int length)
 {
     if (_text == null || length != _text.Length)
     {
         _text  = new char[length];
         _attrs = new CharAttr[length];
     }
     else
     {
         for (int i = 0; i < _attrs.Length; i++)
         {
             _attrs[i] = new CharAttr(null, CharGroup.LatinHankaku);
         }
         for (int i = 0; i < _text.Length; i++)
         {
             _text[i] = '\0';
         }
     }
     _caretColumn = 0;
     _eolType     = EOLType.Continue;
 }
Example #13
0
        /// <summary>
        /// <ja>
        /// 指定範囲を半角スペースで埋めます。
        /// </ja>
        /// <en>
        /// Fill the range of specification with space.
        /// </en>
        /// </summary>
        /// <param name="from"><ja>埋める開始位置(この位置を含みます)</ja><en>Start position(include this position)</en></param>
        /// <param name="to"><ja>埋める終了位置(この位置は含みません)</ja><en>End position(exclude this position)</en></param>
        /// <param name="dec"><ja>テキスト書式を指定するTextDecorationオブジェクト</ja><en>TextDecoration object that specifies text format
        /// </en></param>
        public void FillSpace(int from, int to, TextDecoration dec)
        {
            if (to > _text.Length)
            {
                to = _text.Length;
            }
            TextDecoration fillDec = dec;

            if (fillDec != null)
            {
                fillDec = fillDec.RetainBackColor();
                if (fillDec.IsDefault)
                {
                    fillDec = null;
                }
            }
            for (int i = from; i < to; i++)
            {
                _text[i]  = ' ';
                _attrs[i] = new CharAttr(fillDec, CharGroup.LatinHankaku);
            }
        }
Example #14
0
        //startからcount文字を消去して詰める。右端にはnullを入れる
        /// <summary>
        /// <ja>
        /// 指定された場所から指定された文字数を削除し、その後ろを詰めます。
        /// </ja>
        /// <en>
        /// The number of characters specified from the specified place is deleted, and the furnace is packed afterwards.
        /// </en>
        /// </summary>
        /// <param name="start"><ja>削除する開始位置</ja><en>Start position</en></param>
        /// <param name="count"><ja>削除する文字数</ja><en>Count to delete</en></param>
        /// <param name="dec"><ja>末尾の新しい空白領域のテキスト装飾</ja><en>text decoration for the new empty spaces at the tail of the line</en></param>
        public void DeleteChars(int start, int count, TextDecoration dec)
        {
            char           fillChar;
            TextDecoration fillDec = dec;

            if (fillDec != null)
            {
                fillDec = fillDec.RetainBackColor();
                if (fillDec.IsDefault)
                {
                    fillDec  = null;
                    fillChar = '\0';
                }
                else
                {
                    fillChar = ' ';
                }
            }
            else
            {
                fillChar = '\0';
            }
            for (int i = start; i < _text.Length; i++)
            {
                int j = i + count;
                if (j < _text.Length)
                {
                    _text[i]  = _text[j];
                    _attrs[i] = _attrs[j];
                }
                else
                {
                    _text[i]  = fillChar;
                    _attrs[i] = new CharAttr(fillDec, CharGroup.LatinHankaku);
                }
            }
        }
Example #15
0
        /// <summary>
        /// <ja>
        /// 指定位置に1文字書き込みます。
        /// </ja>
        /// <en>
        /// Write one character to specified position.
        /// </en>
        /// </summary>
        /// <param name="ch"><ja>書き込む文字</ja><en>Character to write.</en></param>
        /// <param name="dec"><ja>テキスト書式を指定するTextDecorationオブジェクト</ja>
        /// <en>TextDecoration object that specifies text format
        /// </en></param>
        public void PutChar(char ch, TextDecoration dec) {
            Debug.Assert(dec != null);
            Debug.Assert(_caretColumn >= 0);
            Debug.Assert(_caretColumn < _text.Length);

            char originalChar = Unicode.ToOriginal(ch);
            CharGroup charGroup = Unicode.GetCharGroup(ch);

            bool onZenkaku = (_attrs[_caretColumn].CharGroup == CharGroup.CJKZenkaku);
            bool onZenkakuRight = (_text[_caretColumn] == GLine.WIDECHAR_PAD);

            if (onZenkaku) {
                //全角の上に書く
                if (!onZenkakuRight) {
                    _text[_caretColumn] = originalChar;
                    _attrs[_caretColumn] = new CharAttr(dec, charGroup);
                    if (CharGroupUtil.GetColumnsPerCharacter(charGroup) == 1) {
                        //全角の上に半角を書いた場合、隣にスペースを入れないと表示が乱れる
                        _caretColumn++;
                        if (_caretColumn < _text.Length) {
                            _text[_caretColumn] = ' ';
                            _attrs[_caretColumn].CharGroup = CharGroup.LatinHankaku;
                        }
                    }
                    else {
                        _attrs[_caretColumn + 1] = new CharAttr(dec, charGroup);
                        _caretColumn += 2;
                    }
                }
                else {
                    _text[_caretColumn - 1] = ' ';
                    _attrs[_caretColumn - 1].CharGroup = CharGroup.LatinHankaku;
                    _text[_caretColumn] = originalChar;
                    _attrs[_caretColumn] = new CharAttr(dec, charGroup);
                    if (CharGroupUtil.GetColumnsPerCharacter(charGroup) == 2) {
                        if (CharGroupUtil.GetColumnsPerCharacter(_attrs[_caretColumn + 1].CharGroup) == 2) {
                            if (_caretColumn + 2 < _text.Length) {
                                _text[_caretColumn + 2] = ' ';
                                _attrs[_caretColumn + 2].CharGroup = CharGroup.LatinHankaku;
                            }
                        }
                        _text[_caretColumn + 1] = GLine.WIDECHAR_PAD;
                        _attrs[_caretColumn + 1] = _attrs[_caretColumn];
                        _caretColumn += 2;
                    }
                    else {
                        _caretColumn++;
                    }
                }
            }
            else { //半角の上に書く
                _text[_caretColumn] = originalChar;
                _attrs[_caretColumn] = new CharAttr(dec, charGroup);
                if (CharGroupUtil.GetColumnsPerCharacter(charGroup) == 2) {
                    if (CharGroupUtil.GetColumnsPerCharacter(_attrs[_caretColumn + 1].CharGroup) == 2) { //半角、全角となっているところに全角を書いたら
                        if (_caretColumn + 2 < _text.Length) {
                            _text[_caretColumn + 2] = ' ';
                            _attrs[_caretColumn + 2].CharGroup = CharGroup.LatinHankaku;
                        }
                    }
                    _text[_caretColumn + 1] = GLine.WIDECHAR_PAD;
                    _attrs[_caretColumn + 1] = _attrs[_caretColumn];
                    _caretColumn += 2;
                }
                else {
                    _caretColumn++; //これが最もcommonなケースだが
                }
            }
        }
Example #16
0
        /// 引数と同じ内容で初期化する。lineの内容は破壊されない。
        /// 引数がnullのときは引数なしのコンストラクタと同じ結果になる。
        /// <summary>
        /// <ja>
        /// 引数と同じ内容で初期化します。
        /// </ja>
        /// <en>
        /// Initialize same as argument.
        /// </en>
        /// </summary>
        /// <param name="cc">
        /// <ja>
        /// 設定するキャレット位置
        /// </ja>
        /// <en>
        /// The caret position to set.
        /// </en>
        /// </param>
        /// <param name="line">
        /// <ja>コピー元となるGLineオブジェクト</ja>
        /// <en>GLine object that becomes copy origin</en>
        /// </param>
        /// <remarks>
        /// <ja>
        /// <paramref name="line"/>がnullのときには、引数なしのコンストラクタと同じ結果になります。
        /// </ja>
        /// <en>
        /// The same results with the constructor who doesn't have the argument when <paramref name="line"/> is null. 
        /// </en>
        /// </remarks>
        public void Load(GLine line, int cc) {
            if (line == null) { //これがnullになっているとしか思えないクラッシュレポートがあった。本来はないはずなんだが...
                Clear(80);
                return;
            }

            Clear(line.Length);
            GWord w = line.FirstWord;
            _text = line.DuplicateBuffer(_text);

            int n = 0;
            while (w != null) {
                int nextoffset = line.GetNextOffset(w);
                while (n < nextoffset) {
                    _attrs[n++] = new CharAttr(w.Decoration, w.CharGroup);
                }
                w = w.Next;
            }

            _eolType = line.EOLType;
            ExpandBuffer(cc + 1);
            this.CaretColumn = cc; //' 'で埋めることもあるのでプロパティセットを使う
        }
Example #17
0
 // 全内容を破棄する
 /// <summary>
 /// <ja>
 /// 保持しているテキストをクリアします。
 /// </ja>
 /// <en>
 /// Clear the held text.
 /// </en>
 /// </summary>
 /// <param name="length"><ja>クリアする長さ</ja><en>Length to clear</en></param>
 public void Clear(int length) {
     if (_text == null || length != _text.Length) {
         _text = new char[length];
         _attrs = new CharAttr[length];
     }
     else {
         for (int i = 0; i < _attrs.Length; i++) {
             _attrs[i] = new CharAttr(null, CharGroup.LatinHankaku);
         }
         for (int i = 0; i < _text.Length; i++) {
             _text[i] = '\0';
         }
     }
     _caretColumn = 0;
     _eolType = EOLType.Continue;
 }
Example #18
0
 /// <summary>
 /// <ja>指定位置に指定された数だけの半角スペースを挿入します。</ja>
 /// <en>The half angle space only of the number specified for a specified position is inserted. </en>
 /// </summary>
 /// <param name="start"><ja>削除する開始位置</ja><en>Start position</en></param>
 /// <param name="count"><ja>挿入する半角スペースの数</ja><en>Count space to insert</en></param>
 /// <param name="dec"><ja>空白領域のテキスト装飾</ja><en>text decoration for the new empty spaces</en></param>
 public void InsertBlanks(int start, int count, TextDecoration dec) {
     TextDecoration fillDec = dec;
     if (fillDec != null) {
         fillDec = fillDec.RetainBackColor();
         if (fillDec.IsDefault)
             fillDec = null;
     }
     for (int i = _text.Length - 1; i >= _caretColumn; i--) {
         int j = i - count;
         if (j >= _caretColumn) {
             _text[i] = _text[j];
             _attrs[i] = _attrs[j];
         }
         else {
             _text[i] = ' ';
             _attrs[i] = new CharAttr(fillDec, CharGroup.LatinHankaku);
         }
     }
 }
Example #19
0
 //startからcount文字を消去して詰める。右端にはnullを入れる
 /// <summary>
 /// <ja>
 /// 指定された場所から指定された文字数を削除し、その後ろを詰めます。
 /// </ja>
 /// <en>
 /// The number of characters specified from the specified place is deleted, and the furnace is packed afterwards. 
 /// </en>
 /// </summary>
 /// <param name="start"><ja>削除する開始位置</ja><en>Start position</en></param>
 /// <param name="count"><ja>削除する文字数</ja><en>Count to delete</en></param>
 /// <param name="dec"><ja>末尾の新しい空白領域のテキスト装飾</ja><en>text decoration for the new empty spaces at the tail of the line</en></param>
 public void DeleteChars(int start, int count, TextDecoration dec) {
     char fillChar;
     TextDecoration fillDec = dec;
     if (fillDec != null) {
         fillDec = fillDec.RetainBackColor();
         if (fillDec.IsDefault) {
             fillDec = null;
             fillChar = '\0';
         }
         else {
             fillChar = ' ';
         }
     }
     else {
         fillChar = '\0';
     }
     for (int i = start; i < _text.Length; i++) {
         int j = i + count;
         if (j < _text.Length) {
             _text[i] = _text[j];
             _attrs[i] = _attrs[j];
         }
         else {
             _text[i] = fillChar;
             _attrs[i] = new CharAttr(fillDec, CharGroup.LatinHankaku);
         }
     }
 }
Example #20
0
 /// <summary>
 /// <ja>
 /// 指定範囲を半角スペースで埋めます。
 /// </ja>
 /// <en>
 /// Fill the range of specification with space. 
 /// </en>
 /// </summary>
 /// <param name="from"><ja>埋める開始位置(この位置を含みます)</ja><en>Start position(include this position)</en></param>
 /// <param name="to"><ja>埋める終了位置(この位置は含みません)</ja><en>End position(exclude this position)</en></param>
 /// <param name="dec"><ja>テキスト書式を指定するTextDecorationオブジェクト</ja><en>TextDecoration object that specifies text format
 /// </en></param>
 public void FillSpace(int from, int to, TextDecoration dec) {
     if (to > _text.Length)
         to = _text.Length;
     TextDecoration fillDec = dec;
     if (fillDec != null) {
         fillDec = fillDec.RetainBackColor();
         if (fillDec.IsDefault)
             fillDec = null;
     }
     for (int i = from; i < to; i++) {
         _text[i] = ' ';
         _attrs[i] = new CharAttr(fillDec, CharGroup.LatinHankaku);
     }
 }
Example #21
0
 public static extern bool SetConsoleTextAttribute(IntPtr ConOut, CharAttr Attributes);
Example #22
0
 public CharInfo(char @char, CharAttr attributes) : this()
 {
     Char       = new CharUnion(@char);
     Attributes = attributes;
 }
Example #23
0
        /// <summary>
        /// <ja>
        /// 指定位置に1文字書き込みます。
        /// </ja>
        /// <en>
        /// Write one character to specified position.
        /// </en>
        /// </summary>
        /// <param name="ch"><ja>書き込む文字</ja><en>Character to write.</en></param>
        /// <param name="dec"><ja>テキスト書式を指定するTextDecorationオブジェクト</ja>
        /// <en>TextDecoration object that specifies text format
        /// </en></param>
        public void PutChar(char ch, TextDecoration dec)
        {
            Debug.Assert(dec != null);
            Debug.Assert(_caretColumn >= 0);
            Debug.Assert(_caretColumn < _text.Length);

            char      originalChar = Unicode.ToOriginal(ch);
            CharGroup charGroup    = Unicode.GetCharGroup(ch);

            bool onZenkaku      = (_attrs[_caretColumn].CharGroup == CharGroup.CJKZenkaku);
            bool onZenkakuRight = (_text[_caretColumn] == GLine.WIDECHAR_PAD);

            if (onZenkaku)
            {
                //全角の上に書く
                if (!onZenkakuRight)
                {
                    _text[_caretColumn]  = originalChar;
                    _attrs[_caretColumn] = new CharAttr(dec, charGroup);
                    if (CharGroupUtil.GetColumnsPerCharacter(charGroup) == 1)
                    {
                        //全角の上に半角を書いた場合、隣にスペースを入れないと表示が乱れる
                        _caretColumn++;
                        if (_caretColumn < _text.Length)
                        {
                            _text[_caretColumn]            = ' ';
                            _attrs[_caretColumn].CharGroup = CharGroup.LatinHankaku;
                        }
                    }
                    else
                    {
                        _attrs[_caretColumn + 1] = new CharAttr(dec, charGroup);
                        _caretColumn            += 2;
                    }
                }
                else
                {
                    _text[_caretColumn - 1]            = ' ';
                    _attrs[_caretColumn - 1].CharGroup = CharGroup.LatinHankaku;
                    _text[_caretColumn]  = originalChar;
                    _attrs[_caretColumn] = new CharAttr(dec, charGroup);
                    if (CharGroupUtil.GetColumnsPerCharacter(charGroup) == 2)
                    {
                        if (CharGroupUtil.GetColumnsPerCharacter(_attrs[_caretColumn + 1].CharGroup) == 2)
                        {
                            if (_caretColumn + 2 < _text.Length)
                            {
                                _text[_caretColumn + 2]            = ' ';
                                _attrs[_caretColumn + 2].CharGroup = CharGroup.LatinHankaku;
                            }
                        }
                        _text[_caretColumn + 1]  = GLine.WIDECHAR_PAD;
                        _attrs[_caretColumn + 1] = _attrs[_caretColumn];
                        _caretColumn            += 2;
                    }
                    else
                    {
                        _caretColumn++;
                    }
                }
            }
            else   //半角の上に書く
            {
                _text[_caretColumn]  = originalChar;
                _attrs[_caretColumn] = new CharAttr(dec, charGroup);
                if (CharGroupUtil.GetColumnsPerCharacter(charGroup) == 2)
                {
                    if (CharGroupUtil.GetColumnsPerCharacter(_attrs[_caretColumn + 1].CharGroup) == 2)   //半角、全角となっているところに全角を書いたら
                    {
                        if (_caretColumn + 2 < _text.Length)
                        {
                            _text[_caretColumn + 2]            = ' ';
                            _attrs[_caretColumn + 2].CharGroup = CharGroup.LatinHankaku;
                        }
                    }
                    _text[_caretColumn + 1]  = GLine.WIDECHAR_PAD;
                    _attrs[_caretColumn + 1] = _attrs[_caretColumn];
                    _caretColumn            += 2;
                }
                else
                {
                    _caretColumn++; //これが最もcommonなケースだが
                }
            }
        }
Example #24
0
        /// <summary>
        /// <ja>
        /// �w��ʒu��1�����������݂܂��B
        /// </ja>
        /// <en>
        /// Write one character to specified position.
        /// </en>
        /// </summary>
        /// <param name="ch"><ja>�������ޕ���</ja><en>Character to write.</en></param>
        /// <param name="dec"><ja>�e�L�X�g������w�肷��TextDecoration�I�u�W�F�N�g</ja>
        /// <en>TextDecoration object that specifies text format
        /// </en></param>
        public void PutChar(char ch, TextDecoration dec)
        {
            Debug.Assert(dec != null);
            Debug.Assert(_caretColumn >= 0);
            Debug.Assert(_caretColumn < _text.Length);

            char originalChar = Unicode.ToOriginal(ch);
            CharGroup charGroup = Unicode.GetCharGroup(ch);

            bool onZenkaku = (_attrs[_caretColumn].CharGroup == CharGroup.CJKZenkaku);
            bool onZenkakuRight = (_text[_caretColumn] == GLine.WIDECHAR_PAD);

            if (onZenkaku) {
                //�S�p�̏�ɏ���
                if (!onZenkakuRight) {
                    _text[_caretColumn] = originalChar;
                    _attrs[_caretColumn] = new CharAttr(dec, charGroup);
                    if (CharGroupUtil.GetColumnsPerCharacter(charGroup) == 1) {
                        //�S�p�̏�ɔ��p��������ꍇ�A�ׂɃX�y�[�X�����Ȃ��ƕ\���������
                        _caretColumn++;
                        if (_caretColumn < _text.Length) {
                            _text[_caretColumn] = ' ';
                            _attrs[_caretColumn].CharGroup = CharGroup.LatinHankaku;
                        }
                    }
                    else {
                        _attrs[_caretColumn + 1] = new CharAttr(dec, charGroup);
                        _caretColumn += 2;
                    }
                }
                else {
                    _text[_caretColumn - 1] = ' ';
                    _attrs[_caretColumn - 1].CharGroup = CharGroup.LatinHankaku;
                    _text[_caretColumn] = originalChar;
                    _attrs[_caretColumn] = new CharAttr(dec, charGroup);
                    if (CharGroupUtil.GetColumnsPerCharacter(charGroup) == 2) {
                        if (CharGroupUtil.GetColumnsPerCharacter(_attrs[_caretColumn + 1].CharGroup) == 2) {
                            if (_caretColumn + 2 < _text.Length) {
                                _text[_caretColumn + 2] = ' ';
                                _attrs[_caretColumn + 2].CharGroup = CharGroup.LatinHankaku;
                            }
                        }
                        _text[_caretColumn + 1] = GLine.WIDECHAR_PAD;
                        _attrs[_caretColumn + 1] = _attrs[_caretColumn];
                        _caretColumn += 2;
                    }
                    else {
                        _caretColumn++;
                    }
                }
            }
            else { //���p�̏�ɏ���
                _text[_caretColumn] = originalChar;
                _attrs[_caretColumn] = new CharAttr(dec, charGroup);
                if (CharGroupUtil.GetColumnsPerCharacter(charGroup) == 2) {
                    if (CharGroupUtil.GetColumnsPerCharacter(_attrs[_caretColumn + 1].CharGroup) == 2) { //���p�A�S�p�ƂȂ��Ă���Ƃ���ɑS�p���������
                        if (_caretColumn + 2 < _text.Length) {
                            _text[_caretColumn + 2] = ' ';
                            _attrs[_caretColumn + 2].CharGroup = CharGroup.LatinHankaku;
                        }
                    }
                    _text[_caretColumn + 1] = GLine.WIDECHAR_PAD;
                    _attrs[_caretColumn + 1] = _attrs[_caretColumn];
                    _caretColumn += 2;
                }
                else {
                    _caretColumn++; //���ꂪ�ł�common�ȃP�[�X����
                }
            }
        }
Example #25
0
        /// �����Ɠ�����e�ŏ���������Bline�̓�e�͔j�󂳂�Ȃ��B
        /// ������null�̂Ƃ��͈����Ȃ��̃R���X�g���N�^�Ɠ������ʂɂȂ�B
        /// <summary>
        /// <ja>
        /// �����Ɠ�����e�ŏ��������܂��B
        /// </ja>
        /// <en>
        /// Initialize same as argument.
        /// </en>
        /// </summary>
        /// <param name="cc">
        /// <ja>
        /// �ݒ肷��L�����b�g�ʒu
        /// </ja>
        /// <en>
        /// The caret position to set.
        /// </en>
        /// </param>
        /// <param name="line">
        /// <ja>�R�s�[���ƂȂ�GLine�I�u�W�F�N�g</ja>
        /// <en>GLine object that becomes copy origin</en>
        /// </param>
        /// <remarks>
        /// <ja>
        /// <paramref name="line"/>��null�̂Ƃ��ɂ́A�����Ȃ��̃R���X�g���N�^�Ɠ������ʂɂȂ�܂��B
        /// </ja>
        /// <en>
        /// The same results with the constructor who doesn't have the argument when <paramref name="line"/> is null. 
        /// </en>
        /// </remarks>
        public void Load(GLine line, int cc)
        {
            if (line == null) { //���ꂪnull�ɂȂ��Ă���Ƃ����v���Ȃ��N���b�V�����|�[�g���������B�{���͂Ȃ��͂��Ȃ񂾂�...
                Clear(80);
                return;
            }

            Clear(line.Length);
            GWord w = line.FirstWord;
            _text = line.DuplicateBuffer(_text);

            int n = 0;
            while (w != null) {
                int nextoffset = line.GetNextOffset(w);
                while (n < nextoffset) {
                    _attrs[n++] = new CharAttr(w.Decoration, w.CharGroup);
                }
                w = w.Next;
            }

            _eolType = line.EOLType;
            ExpandBuffer(cc + 1);
            this.CaretColumn = cc; //' '�Ŗ��߂邱�Ƃ����̂Ńv���p�e�B�Z�b�g��g��
        }