Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Oberon
Перезагрузить страницу Подсветка синтаксиса в BlackBox собственными руками
Ответ
 
Опции темы Опции просмотра
  (#46 (permalink)) Старый
Takun Takun вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.05.2005
По умолчанию 31.05.2005, 22:29

Цитата:
Originally posted by S.Yu.Gubanov
[b]Обновил с учетом последних сообщений:
http://www.rsdn.ru:80/File/30795/Master.zip
Похоже в моем "патче" содержалась новая ошибка , в части проверки нажатия управляющих клавиш. В исправленной версии:

Код:
PROCEDURE SourceChanged(IN msg: Controllers.EditMsg): BOOLEAN;
  VAR res: BOOLEAN;
    BEGIN
  res :=
     (* cut, paste operatuins *)
    (msg.op IN {Controllers.cut, Controllers.paste}) OR
    (
        (msg.op = Controllers.pasteChar) &
    ~ (
            (* page up, page down, home, cursor keys *)
      (
          (ORD(msg.char) < 32) & (ORD(msg.char) IN { 12H..15H, 1CH .. 1FH})) OR
      (* control key *)    
      (Controllers.modify IN msg.modifiers) 
        )    
      );
  
  RETURN  res
      
    END SourceChanged;

    PROCEDURE (v: View) HandleCtrlMsg* (f: Views.Frame; VAR msg: Controllers.Message; 
  VAR focus: Views.View);
  VAR scrlMsg: Controllers.ScrollMsg;    
    BEGIN
  WITH
      | msg: Controllers.EditMsg DO 
    v.needRefresh :=v.needRefresh OR SourceChanged(msg);
...
Еще пара соображений:
1) в методе Restore лучше делать установку фрейма каждый раз (как в примере врапперов) иначе иногда он теряется, например при нажатии Ctrl+H.

2)удобно вынести в меню команды "Включить подсветку в текущем документе" и "Выключить ..."

Код:
    PROCEDURE Wrap*;
  VAR poll: Controllers.PollOpsMsg; w: View; replace: Controllers.ReplaceViewMsg;
      viewToWrap: TextViews.View; wind: Windows.Window;
    BEGIN
  Controllers.PollOps(poll);
  IF (poll.singleton # NIL) & (poll.singleton IS TextViews.View) THEN
      viewToWrap := poll.singleton(TextViews.View)
  ELSE
      wind :=  Windows.dir.Focus(Controllers.path);
      IF  (wind # NIL) & (wind.doc.ThisView() IS TextViews.View) THEN
    viewToWrap :=wind.doc.ThisView()(TextViews.View);
      END    
  END;
  IF viewToWrap # NIL THEN
      NEW(w); w.inner := viewToWrap; Stores.Join(w, w.inner);
      replace.old := viewToWrap; replace.new := w;
      Controllers.Forward(replace);
      w.Colorize;
  ELSE Dialog.Beep
  END
    END Wrap;

    PROCEDURE Unwrap*;
  VAR poll: Controllers.PollOpsMsg; replace: Controllers.ReplaceViewMsg;
  viewToUnwrap: View; wind: Windows.Window;
    BEGIN
  Controllers.PollOps(poll);
  IF (poll.singleton # NIL) & (poll.singleton IS View) THEN
      viewToUnwrap := poll.singleton(View)
  ELSE
      wind :=  Windows.dir.Focus(Controllers.path);
      IF  (wind # NIL) & (wind.doc.ThisView() IS View) THEN
    viewToUnwrap :=wind.doc.ThisView()(View);
      END    
  END;
  IF viewToUnwrap # NIL THEN  
      replace.old := viewToUnwrap; replace.new := viewToUnwrap.inner;
      Controllers.Forward(replace)
  ELSE Dialog.Beep
  END
    END Unwrap;
Серьезным ограничением остается "необработка" трапов, но я не вижу тут другого выхода, кроме взлома Dev.
Ответить с цитированием
  (#47 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 01.06.2005, 12:50

Обновил.

http://www.rsdn.ru:80/File/30795/Master.zip

(57.8 KB)

Для Wrap / Unwrap еще добавил FocusGuard-ы, чтобы пункты меню были не доступны когда документ уже обернут и его нельзя еще раз обернуть и наоборот.
Ответить с цитированием
  (#48 (permalink)) Старый
Takun Takun вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.05.2005
По умолчанию 12.06.2005, 02:29

Еще раз по поводу трапов. Небольшая доработка DevDebug позволяет обойти проблему. (интересно, почему сразу так не сделали?)

Код:
    PROCEDURE ShowSourcePos (name: Name; adr: INTEGER);
  VAR 
...
      (*c: Containers.Controller;*) 
...
      selMsg: TextControllers.SetSelectionMsg;
      posMsg: TextViews.PositionMsg;
    BEGIN
...
(*        c := v(TextViews.View).ThisController();*)
(*        v(TextViews.View).ShowRange(beg, end, TextViews.any);*)
(*        c(TextControllers.Controller).SetSelection(beg, end)*)
        posMsg.beg := beg; posMsg.end := end; posMsg.focusOnly := TextViews.any;
        Models.Broadcast(m, posMsg);        
        selMsg.beg := beg; selMsg.end := end;
        Models.Broadcast(m, selMsg)
...
    END ShowSourcePos;
Ответить с цитированием
Ads
  (#49 (permalink)) Старый
Takun Takun вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.05.2005
По умолчанию 12.06.2005, 02:39

Цитата:
Originally posted by S.Yu.Gubanov+-->
Цитата:
<!--QuoteBegin-Takun
Цитата:
[b]...раскраска не попадает в список отменяемых...
Да, на это много памяти тратилось (чтоб запомнить что было изменено, а что нет). Так что это на столько полезно, что Views.BeginModification / Views.EndModification надо внести еще и в процедуру MasterColors.Colorize
и Master.ColorizeText тоже.
Ответить с цитированием
  (#50 (permalink)) Старый
Takun Takun вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 18.05.2005
По умолчанию 12.06.2005, 02:55

Более конкретно, предлагаю такой вариант:

1) Переместить скрипт из Colorize в ColorizeText т.к. он вызывается и из MasterViews.
2) Не делать notUndoable, т.к. объявив что-то как неоткатываемое мы тем самым делаем неоткатываемым и все предыдущие действия, в том числе собственно ввод текста.

Код:
    PROCEDURE ColorizeText* (text: TextModels.Model);
  VAR s: MasterColorScanner.Scanner;
    BEGIN
  (* BEGIN modify *)  
  (* Models.BeginModification(Models.notUndoable, text); *)
  Models.BeginModification(Models.invisible, text); 
  s := MasterColorScanner.NewScanner(text.NewReader(NIL), syntax);
  WHILE s.Scan() DO text.SetAttr(s.beg, s.end, s.attr) END;
  Models.EndModification(Models.invisible, text); 
  (* Models.EndModification(Models.notUndoable, text); *)
  (* END modify *)      
    END ColorizeText;

    PROCEDURE Colorize* ();
  VAR controller: TextControllers.Controller; caret: INTEGER;
    BEGIN
  controller := TextControllers.Focus(); 
  IF controller # NIL THEN
      caret := controller.CaretPos();
      ColorizeText(controller.text);
      controller.SetCaret(caret);
  END
    END Colorize;
Ответить с цитированием
Ads.
  (#51 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 25.07.2005, 17:26

А еще можно вот так сделать:

PROCEDURE (v: View) Restore* (f: Views.Frame; l, t, r, b: INTEGER);
BEGIN
Views.InstallFrame(f, v.inner, 0, 0, 0, TRUE);
f.DrawRect(f.l, f.t, f.r, f.b, 1*Ports.point, Ports.RGBColor(0, 0, 200))
END Restore;

это чтобы сразу видно было, что используется автораскраска...
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсветка синтаксиса как реализовать Exmap .NET 3 04.10.2008 20:50
NVIDIA и ATi должны обладать собственными фабриками для войны с Intel ORTODOX О производителях 0 25.04.2008 13:51
Подсветка синтаксиса на форуме Mnior Prolog 12 06.11.2006 18:31
Меню BlackBox как в нем исправить ошибки delpher Oberon 12 25.02.2006 12:43
Подсветка синтаксиса wils0n Eclipse 2 16.12.2005 18:36
Минимальная программа на BlackBox sacred1972 Oberon 1 17.11.2005 13:58
Как создать EXE файл в BlackBox ais Oberon 8 01.08.2005 05:48
Проблемы с DirectInput + VS 6.0 и собственными модулями(ООП) Мелкий Программирование графики 1 22.07.2005 12:22
подсветка Smarty-синтаксиса kost PHP 2 12.06.2005 13:12
Как получить BlackBox PROnya Oberon 12 22.02.2005 07:21
Подсветка синтаксиса в слитном тексте Начинающий Visual C++ 0 30.04.2004 22:58
BlackBox под Linux где найти в интернете Anonymous Oberon 3 13.04.2003 04:46



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов