/*Windows.c -- Includes all routines that access the stuff in Windows.h*/ extern struct MenuItem *ItemAddress(); #include "Globals.h" #include "Windows.h" #define ABOUT_Y_REG 42 #define ABOUT_Y_LACED 142 void OpenGraphics() /*Open screen, window, etc.*/ { /*Open screen*/ NewWindow.Screen=Screen=(struct Screen *)OpenScreen(&NewScreen); if(Screen==NULL) Leave(50,"Can't open screen!!"); LoadColors(&(Screen->ViewPort)); /*Set screen colors to those in prefs*/ /*Open backdrop window & make requestors open onto it*/ if((ThisProc->pr_WindowPtr=Window= (struct Window *)OpenWindow(&NewWindow))==NULL) { CloseScreen(Screen); Leave(60,"Can't open Window!"); } /*Install menus*/ SetMenuStrip(Window,&Menu1); /*Setup the console.device*/ consoleWritePort=(struct Port *)CreatePort("mycon.write",0); if(consoleWritePort==NULL) Leave(70,"Couldn't open console.device!"); consoleWriteMsg=(struct IOStdReq *)CreateStdIO(consoleWritePort); if(consoleWriteMsg==NULL) Leave(80,"Couldn't open console.device!"); consoleReadPort=(struct Port *)CreatePort("mycon.read",0); if(consoleReadPort==NULL) Leave(90,"Can't create communications port!"); consoleReadMsg=(struct IOStdReq *)CreateStdIO(consoleReadPort); if(consoleReadMsg==NULL) Leave(100,"Can't create standard IO!"); consoleWriteMsg->io_Data=(struct Window *)Window; /*Attach console*/ consoleWriteMsg->io_Length=sizeof(struct Window); /*device to window...*/ OpenDevice("console.device",0,consoleWriteMsg,0); /*& open it*/ ConsoleDevice=consoleReadMsg->io_Device=(APTR)consoleWriteMsg->io_Device; consoleReadMsg->io_Unit=consoleWriteMsg->io_Unit; /*Get the current keymap*/ consoleReadMsg->io_Command=CD_ASKKEYMAP; consoleReadMsg->io_Length=sizeof(struct KeyMap); consoleReadMsg->io_Data=&keymap; DoIO(consoleReadMsg); TitleErrorCancel(); } void CloseGraphics() /*Close the window, screen, etc.*/ { CloseDevice(consoleWriteMsg); DeleteStdIO(consoleWriteMsg); DeleteStdIO(consoleReadMsg); DeletePort(consoleWritePort); DeletePort(consoleReadPort); ClearMenuStrip(Window); CloseWindow(Window); CloseScreen(Screen); } /*This is in liner.c and not menu.c because it needs to manipulate the*/ /*'Liner NewScreen and NewWindow information, which it can't do from*/ /*menu.c*/ void ChangeDisplay() { UBYTE X,Y; BOOL stat1,stat2,stat3,stat4; X=CurX; Y=CurY; stat1=HandleInterlaced(); stat2=SwapScrnSize(); stat3=DoubleSpacing(); stat4=HandleStartingLevel(); if( stat1 || stat2 ) { if( stat3 || stat4 ) CheckModified(); CloseGraphics(); OpenGraphics(); SetRowsInScreen(); PrintItemList(FirstScrnItem,1); if( !stat3 ) { if(Y > DispRows) /*if the old laced Y is > the current possible rows*/ { Y=DispRows; /*Y now = the last screen item*/ CurrentItem=(struct LineItem *)ScrnBtm; } if(X > MaxX(CurrentItem)) /*Out of bounds*/ X=MaxX(CurrentItem); else if(X < MinX(CurrentItem)) X=MinX(CurrentItem); PlotCursor(X,Y); /*Restore cursor position*/ } else { CurrentItem=(struct LineItem *)FirstScrnItem; PlotCursor(MinX(FirstScrnItem),1); } } else if( stat3 || stat4 ) { SetRowsInScreen(); PrintItemList(FirstScrnItem,1); if( !stat3 ) { if(Y > DispRows) /*if the old laced Y is > the current possible rows*/ { Y=DispRows; /*Y now = the last screen item*/ CurrentItem=(struct LineItem *)ScrnBtm; } if(X > MaxX(CurrentItem)) /*Out of bounds*/ X=MaxX(CurrentItem); else if(X < MinX(CurrentItem)) X=MinX(CurrentItem); PlotCursor(X,Y); /*Restore cursor position*/ } else { CurrentItem=(struct LineItem *)FirstScrnItem; PlotCursor(MinX(FirstScrnItem),1); CheckModified(); } } } BOOL HandleStartingLevel() /*Change the starting level*/ { BYTE c; for(c=0;c<6 && (SubItems[c]->Flags & CHECKED) != CHECKED;c++); if(c==6) { c=0; SubItems[0]->Flags |= CHECKED; } if(c!=StartingLevel) { StartingLevel=c; return(TRUE); } return(FALSE); } BOOL DoubleSpacing() /*Toggle between single & double spacing*/ { if(prefs.DS==(( DOUBSPAC_MI.Flags & CHECKED)==CHECKED)) return(FALSE); prefs.DS=!prefs.DS; return(TRUE); } BOOL HandleInterlaced() /*Toggle between a normal and interlaced screen*/ { if(prefs.Laced == ((INTERLACE_MI.Flags & CHECKED) == CHECKED)) return(FALSE); if(prefs.Laced) /*If interlaced*/ { NewScreen.Height/=2; NewWindow.Height=NewScreen.Height-11; NewScreen.ViewModes=HIRES; /*Remove LACE from screen description*/ prefs.Laced=FALSE; /*Status switch*/ } else /*not interlaced*/ { NewScreen.Height*=2; NewWindow.Height=(NewScreen.Height-11); NewScreen.ViewModes=HIRES+LACE; /*Add LACE to screen description*/ prefs.Laced=TRUE; } return(TRUE); } BOOL SwapScrnSize() /*Change a standard sized screen to Workbench sized & back*/ { UBYTE X,Y; BYTE stat; X=CurX; Y=CurY; /*Store cursor position*/ stat = FALSE; if(((WBENCH_SI.Flags & CHECKED) == CHECKED) && prefs.Screen==0) { prefs.Screen = 1; /*Switch to Workbench sized screen*/ NewScreen.Height=GetWBHeight(); /*Get height of Workbench screen*/ if(NewScreen.Height > 300) /*Prob. interlaced*/ NewScreen.Height /= 2; /*Cut it down*/ stat=TRUE; } if(((STANDARD_SI.Flags & CHECKED) == CHECKED) && prefs.Screen == 1) { prefs.Screen = 0; /*Switch to standard screen*/ NewScreen.Height=200; stat=TRUE; } if(!stat) return(FALSE);; if(prefs.Laced) NewScreen.Height*=2; NewWindow.Height=NewScreen.Height-11; /*'Liner's window is always 11*/ /*lines shorter than the host screen*/ return(TRUE); } void ModifyMenus(Flag)/*Modify Double Spacing and Starting Level menus for the*/ char Flag; /*ReadItemList function*/ { if(Flag>=32) /*If double spaced...*/ { prefs.DS=TRUE; MenuItem1.Flags=CHECKIT+ITEMTEXT+COMMSEQ+MENUTOGGLE+ ITEMENABLED+HIGHCOMP+CHECKED; Flag-=32; /*Removed double spacing flag*/ } else { prefs.DS=FALSE; MenuItem1.Flags=CHECKIT+ITEMTEXT+COMMSEQ+MENUTOGGLE+ ITEMENABLED+HIGHCOMP; } SubItems[StartingLevel]->Flags-=CHECKED; StartingLevel=(Flag <= 5) ? Flag : 5; SubItems[StartingLevel]->Flags+=CHECKED; } void GetLinerPrefs(filename) char *filename; { struct FileHandle *fp; if((fp=(struct FileHandle *)Open(filename,MODE_OLDFILE))==NULL) return; /*If no preferences file could be found*/ /*use the defaults*/ Read(fp,&prefs,sizeof(struct LinerPrefs)); /*Read in the preferences*/ Close(fp); /*Close the file*/ } void InterpretPrefs() /*Install the preferences*/ { StartingLevel = 0; SubItems[StartingLevel]->Flags+=CHECKED; ModifyMenus(prefs.Level+((prefs.DS) ? 32 : 0)); /*Double spacing and*/ /*starting level*/ if(prefs.Icons) MenuItem3.Flags+=CHECKED; if(prefs.Screen == 0) /*Standard screen*/ { SubItem1.Flags+=CHECKED; NewScreen.Height=200; } else /*Workbench screen*/ { SubItem2.Flags+=CHECKED; NewScreen.Height=GetWBHeight(); /*Get the Workbench height*/ if(NewScreen.Height > 300) /*Then it's interlaced*/ NewScreen.Height/=2; /*so cut it in half*/ } NewScreen.ViewModes=HIRES; if(prefs.Laced) { NewScreen.Height*=2; /*Double the screen size*/ NewScreen.ViewModes+=LACE; MenuItem2.Flags+=CHECKED; } else NewScreen.ViewModes=HIRES; NewWindow.Height=NewScreen.Height-11; prefs.Name[0][12]=NULL; /*Make sure none of the name >12 characters*/ prefs.Name[1][12]=NULL; prefs.Name[2][12]=NULL; prefs.Name[3][12]=NULL; CopyPrefsToMenus(); strcpy(SDirName,prefs.DefaultDir); /*Get the default disk directories*/ strcpy(PDirName,prefs.DefPrintDir); strcpy(SExt,prefs.DefPattern); /*And the default filepattern*/ OpenGraphics(); /*And open the screen, window, etc...*/ SetRowsInScreen(); } PutPrefs(filename,AREXX) /*Save the preferences to disk*/ char *filename; BYTE AREXX; { struct FileHandle *fp; if((fp=(struct FileHandle *)Open(filename,MODE_NEWFILE))==NULL) { if(!AREXX) TitleError("Couldn't save the preferences!"); return(FALSE); } strcpy(prefs.Name[0],IText21.IText); /*Copy ARexx macro info*/ strcpy(prefs.Name[1],IText20.IText); strcpy(prefs.Name[2],IText19.IText); strcpy(prefs.Name[3],IText18.IText); strcpy(prefs.DefaultDir,SDirName); strcpy(prefs.DefPrintDir,PDirName); strcpy(prefs.DefPattern,SExt); prefs.Level=StartingLevel; Write(fp,&prefs,sizeof(struct LinerPrefs)); Close(fp); /*Done*/ CreatePrefsIcon(); /*Make the icon for liner.prefs*/ return(TRUE); } void CopyPrefsToMenus() { strcpy(IText21.IText,prefs.Name[0]); /*Copy ARexx info to the menus*/ strcpy(IText20.IText,prefs.Name[1]); strcpy(IText19.IText,prefs.Name[2]); strcpy(IText18.IText,prefs.Name[3]); } GetWBHeight() /*Get the height of the Workbench screen*/ { int height; ULONG ILock; struct Screen *s; ILock=LockIBase(0); /*Lock IntuitionBase while I find the WB screen size*/ s=(struct Screen *)IntuitionBase->FirstScreen; while( (s != NULL) && ((s->Flags & CUSTOMSCREEN) == CUSTOMSCREEN) ) s=(struct Screen *)s->NextScreen; /*Search to end of list or first*/ /*non CUSTOMSCREEN screen (ie WBENCHSCREEN)*/ if(s==NULL) /*If not found, give a default height of 200*/ height=200; else height=s->Height; UnlockIBase(ILock); /*Unlock IntuitionBase*/ return(height); /*And we're done*/ } struct MenuItem *GetFirstItemAddress(code) /*Get a MenuItem associated*/ USHORT code; /*with the menu's number*/ { return(ItemAddress(&Menu1,code)); } void SaveColors(vp) /*Save the screen's colors to prefs*/ struct ViewPort *vp; { ULONG c,rgb; for(c=0; c < 4 ; c++) /*Get screen colors*/ { rgb=GetRGB4(vp->ColorMap,c); prefs.Color[c][0]=(rgb >> 8) & 0xF; prefs.Color[c][1]=(rgb >> 4) & 0xF; prefs.Color[c][2]= rgb & 0xF; } } void LoadColors(vp) /*Change the screen colors to those in prefs*/ struct ViewPort *vp; { ULONG c; for(c=0; c < 4; c++) SetRGB4(vp,c,prefs.Color[c][0],prefs.Color[c][1],prefs.Color[c][2]); } void ClearMenus()/*Set the menus to state they are in when 'Liner is first run*/ { if(MenuItem3.Flags & CHECKED) /*Icons*/ MenuItem3.Flags-=CHECKED; if(SubItem1.Flags & CHECKED) /*Standard/Workbench screen*/ SubItem1.Flags-=CHECKED; else SubItem2.Flags-=CHECKED; ModifyMenus(0); /*Set Double spacing and Starting level menus*/ SubItems[StartingLevel]->Flags-=CHECKED; if(MenuItem2.Flags & CHECKED) MenuItem2.Flags-=CHECKED; } void SetRowsInScreen() /*Determine the # of text rows in a screen*/ { int temp; /*Divide the height of the window by the current font's*/ temp=(Window->Height)/Window->IFont->tf_YSize; /*height*/ if(prefs.DS) /*If double spaced*/ { RowsInScreen=(Window->Height)/(Window->IFont->tf_YSize*2); if(temp != RowsInScreen*2) /*Needed to keep extra lines from showing*/ Odd=TRUE; /*up in some circumstances*/ else Odd=FALSE; } else RowsInScreen=temp; } void ModifyOtherMenus(menu) /*Change Interlaced, Icon, and screen size */ BYTE menu; /*menus where appropriate*/ { switch(menu) { case 1: /*Interlaced menu*/ if(prefs.Laced) MenuItem2.Flags-=CHECKED; else MenuItem2.Flags+=CHECKED; break; case 2: /*Icon creation*/ if(prefs.Icons) MenuItem3.Flags-=CHECKED; else MenuItem3.Flags+=CHECKED; break; case 3: /*Screen size manipulation*/ if(prefs.Screen==0) /*Standard screen*/ { SubItem2.Flags+=CHECKED; SubItem1.Flags-=CHECKED; } else { SubItem2.Flags-=CHECKED; SubItem1.Flags+=CHECKED; } } } HandleAbout() /*Displays the 'About' window*/ { /*It's here because it needs to access Windows.h*/ struct Window *AboutWdw; NewAboutWindow.Screen=Screen; /*Pointer to window's screen*/ if(prefs.Laced) NewAboutWindow.TopEdge=ABOUT_Y_LACED; else NewAboutWindow.TopEdge=ABOUT_Y_REG; if((AboutWdw=(struct Window *)OpenWindow(&NewAboutWindow))==NULL) return(FALSE); SetWindowTitles(AboutWdw,-1,"For your information..."); SetAPen(AboutWdw->RPort,1); PrintIText(AboutWdw->RPort,&IntuiTextList2,0,0); /*Wait for the user to press the Continue... gadget*/ Wait(1<UserPort->mp_SigBit); CloseWindow(AboutWdw); /*Close the window*/ } NewAll() /*Get rid of all the Items*/ { char Buffer[10]; FreeListMem(FirstItem,LastItem); prefs.DS=FALSE; SetRowsInScreen(); ModifyMenus(0); /*Set menus (Double Spacing & Starting Level) to defaults*/ StartingLevel=0; SubItems[0]->Flags|=CHECKED; /*Setup a fresh outline*/ FirstItem=LastItem=FirstScrnItem=ScrnBtm=CurrentItem= (struct LineItem *)InsertItem(NULL,NULL); if(FirstItem==NULL) { CloseGraphics(); CloseLibrary(IconBase); CloseLibrary(DosBase); Leave(1000,"Out of memory!"); } CurrentItem->Level=1; Buffer[0]=0x0c; WriteConsole(Buffer,1); Buffer[0]=CSI; Buffer[1]='0'; Buffer[2]=0x6d; WriteConsole(Buffer,3); /*Cancel any highlighting*/ InvsMode=NOINV; PrintItemList(CurrentItem,1); PlotCursor(MinX(CurrentItem),CurY); Modified=FALSE; TitleErrorCancel(); MenuItem1.Flags=CHECKIT+ITEMTEXT+COMMSEQ+MENUTOGGLE+ITEMENABLED+HIGHCOMP; FileName[0]=NULL; /*Remove default filenames*/ SFileName[0]=NULL; PDName[0]=NULL; PFileName[0]=NULL; TitleErrorCancel(); return(TRUE); } void HandleIcons() { prefs.Icons = ((ICON_MI.Flags & CHECKED)==CHECKED); } void HandleEvent(object) APTR object; { if (object == (APTR)&MenuItem21) { HandleNew(object); return; } if (object == (APTR)&MenuItem22) { HandleOpen(FALSE); return; } if (object == (APTR)&MenuItem23) { Save(FALSE); return; } if (object == (APTR)&MenuItem24) { HandleSaveAs(FALSE); return; } if (object == (APTR)&SubItem11) { HandlePrintPrinter(FALSE); return; } if (object == (APTR)&SubItem12) { HandlePrintDisk(FALSE,""); return; } if (object == (APTR)&MenuItem26) { HandleAbout(FALSE); return; } if (object == (APTR)&MenuItem27) { HandleQuit(FALSE); return; } if (object == (APTR)&MenuItem17) { HandleCut(FALSE); return; } if (object == (APTR)&MenuItem18) { HandleCopy(FALSE); return; } if (object == (APTR)&MenuItem19) { HandlePaste(FALSE); return; } if (object == (APTR)&MenuItem20) { HandleErase(FALSE); return; } if (object == (APTR)&MenuItem14) { DoSearch(FALSE,FALSE); return; } if (object == (APTR)&MenuItem15) { DoSearch(TRUE,FALSE); return; } if (object == (APTR)&MenuItem10) { EngageMacro(prefs.Macro[0]); return; } if (object == (APTR)&MenuItem11) { EngageMacro(prefs.Macro[1]); return; } if (object == (APTR)&MenuItem12) { EngageMacro(prefs.Macro[2]); return; } if (object == (APTR)&MenuItem13) { EngageMacro(prefs.Macro[3]); return; } if (object == (APTR)&MenuItem1) { ChangeDisplay(); return; } if (object == (APTR)&MenuItem2) { ChangeDisplay(); return; } if (object == (APTR)&MenuItem3) { HandleIcons(object); return; } if (object == (APTR)&SubItem3) { ChangeDisplay(); return; } if (object == (APTR)&SubItem4) { ChangeDisplay(); return; } if (object == (APTR)&SubItem5) { ChangeDisplay(); return; } if (object == (APTR)&SubItem6) { ChangeDisplay(); return; } if (object == (APTR)&SubItem7) { ChangeDisplay(); return; } if (object == (APTR)&SubItem8) { ChangeDisplay(); return; } if (object == (APTR)&MenuItem5) { HandlePalette(object); return; } if (object == (APTR)&SubItem1) { ChangeDisplay(); return; } if (object == (APTR)&SubItem2) { ChangeDisplay(); return; } if (object == (APTR)&MenuItem7) { GetMacroInfo(); return; } if (object == (APTR)&MenuItem8) { HandleReloadPrefs(object); return; } if (object == (APTR)&MenuItem9) { PutPrefs("liner:liner.prefs",FALSE);return;} if (object == (APTR)&SubItem9) { ReplaceAll(TRUE); return; } if (object == (APTR)&SubItem10) { ReplaceAll(FALSE); return; } } /*End of Windows.c*/