Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[4]

apps : Application*

test case os(apps) usr() end

-- End Of Scheme

Задаем некоторый список приложений apps и начинаем паралельно выполнять os(apps) и usr().

2.2 Application level

Ниже приводим более конкретную схему приложения, на следующем, более подробном, уровене проектирования. Более конкретное описание работы пользователя нас пока не интересует. Его можно было бы уточнять таким же способом, попутно создавая РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ.

2.2.1 Concrete application

Команды типа Pointer, которые получает приложение из канала appIn теперь имеют отношение к панелям. Аналогично схеме l0 os.rsl, в схеме l1 app.rsl

•по команде prev или next выбирается предыдущая или следующая панель(см. функцию focus);

•по команде exit принудительно закрывается текущая панель;

•команда curr не вызывает никаких действий;

•команда, полученная из меню:

-не вызывает никаких действий (если текущая панель модальная);

-или меняет список панелей вызывая функцию openNewOrSelectOldTable.

•функция mkApplication создает приложение, заголовок приложения и главная панель берутся из функции startAction, список панелей -пустой, в качестве меню используется величина MainMenu.

-- Start of Scheme

rsl/T0, rsl/L1 PAN

scheme L1 APP = with T0 in


extend L1 PAN with class

AppInput = Pointer

AppOutput

-- the last parameter of application is the main

-- window

-- it is impossible to close main window of application

Application = Text x Panel* x MPanel x MenuItem-set

channel appIn : AppInput, appOut : AppOutput

value app : Application -

in appIn, panIn, any out appOut, panOut, any Unit app((nm, pnls, mp, ms)) = let aCmd = appIn? in

-- exit - dont output anything. it means stop

-- the application if aCmd = exit then - -

exitAction

(pnls, mp) - - to make some actions depending on main panel else - -

let (a, pnls1) = focus(aCmd, pnls, mp, ms) in appOut!a ; if len pnls1 > 0

then panOut!mkPanOutput(hd pnls1) end ;

app((nm, pnls1, mp, ms))

move focus to next or prev

MenuItem

panel, or close current panel

end end end

верхняя ветка читает канал appIn.

нижняя (pan) читает канал panIn. Пользователь пишет только в один из них.


Это значит, что

попадем в нижнию ветку, если пользователь кликал на кнопки панели,

((nm, pan(pnls), mp, ms)) - - то есть канал panIn не пуст

mkAppOutput : Application - AppOutput, mkAppOutput : MPanel x Menultem-set - AppOutput

--mkAppOutput

-- to add new items to menu

mkMenu : Menultem-set x Panel* - Menultem-set , focus :

AppInput x Panel* x MPanel x MenuItem-set - AppOutput x Panel* focus(aCmd, pnls, mp, ms) =

let ps = let

l = len pnls, (modal, txt, pis, pc) = hd pnls

case aCmd of

- - to move last panel forward prev -

if l < 2 V modal then pnls

-- to move first panel back

next - if l < 2 V modal then pnls else

( pnls(x) x in ( 2 .. l) ) л ( pnls(1)) end

-- to close current panel

close - if l > 0 then tl pnls else ( ) end

-- to do nothing



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15]