/* This file is part of TIFFViewer Copyright (C) 2002-4 Toby Thain, toby@telegraphics.com.au This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include "tiffviewer.h" #include "choosefile.h" extern Boolean run; struct AE_handler handlers[]={ {kCoreEventClass,kAEOpenApplication,handle_open_app}, {kCoreEventClass,kAEOpenDocuments,my_open_doc}, // {kCoreEventClass,kAEPrintDocuments,handle_print_doc}, {kCoreEventClass,kAEQuitApplication,handle_quit_app}, 0 }; OSErr open_app(void){ do_open(); return noErr; } AE_HANDLER(my_open_doc){ AEDescList docList; long i,n; AEKeyword theAEKeyword; DescType typeCode; FSSpec fss; Size actualSize; OSErr e; if(!(e = AEGetParamDesc(theAppleEvent,keyDirectObject,typeAEList,&docList))){ if( !(e = got_required_params(theAppleEvent)) && !(e = AECountItems(&docList,&n)) ){ for( i=1 ; i<=n ; ++i ) if( !(e = AEGetNthPtr(&docList,i,typeFSS,&theAEKeyword, &typeCode,(Ptr)&fss,sizeof(FSSpec),&actualSize)) ){ open_doc(&fss); } } AEDisposeDesc(&docList); } return e; } /*OSErr print_doc(FSSpec *fss){ } */ OSErr quit_app(void){ while(FrontWindow()) close_window(FrontWindow()); run = false; return noErr; } void do_open(){ StandardFileReply sfr; NavReplyRecord reply; static OSType TIFF_type = 'TIFF'; if(choosefiletypes("\pOpen a TIFF file",&sfr,&reply,&TIFF_type,1,NULL)) open_doc(&sfr.sfFile); } void eventloop(){ EventRecord e; WindowPtr win; Boolean f; BitMap sb; wdata *wd; Rect r,r2; Point pt; int windowpart; long resized; GrafPtr gp; for(run=true;run;){ if(f = WaitNextEvent(everyEvent,&e,-1,0)) switch(e.what){ case mouseDown: switch(windowpart = FindWindow(e.where,&win)){ case inMenuBar: fixmenus(); do_menu(MenuSelect(e.where)); break; // inSysWindow = 2, case inContent: if(win == FrontWindow()) contentclick(win,&e); else SelectWindow(win); break; case inDrag: GetQDGlobalsScreenBits(&sb); DragWindow(win,e.where,&sb.bounds); break; case inGrow: wd = (wdata*)GetWRefCon(win); BOTRIGHT(r) = natural_size(win); r.left = width_filter(win,0); r.top = height_filter(win,0); #if TARGET_CARBON if(resized = ResizeWindow(win,e.where,&r,&r2)) adjust_scrollers(win,wd->bounds.right,wd->bounds.bottom,wd->hscroll,wd->vscroll); #else ++r.right; ++r.bottom; /* longstanding bug in Window Manager??? */ if(resized = *(long*)&pt = GrowWindow(win,e.where,&r)){ inval_grow(win); SizeWindow(win,pt.h,pt.v,true); inval_grow(win); adjust_scrollers(win,wd->bounds.right,wd->bounds.bottom,wd->hscroll,wd->vscroll); } #endif if(resized){ global_wind_rect(win,&r); #if 0 //TARGET_CARBON SetWindowIdealUserState(win,&r); #else SetWindowUserState(win,&r); #endif } break; case inGoAway: if(TrackGoAway(win,e.where)) close_window(win);//quit_app(); break; case inZoomIn: case inZoomOut: // InitCursor(); if(TrackBox(win,e.where,windowpart)){ wd = (wdata*)GetWRefCon(win); SetPortWindowPort(win); inval_grow(win); #if 0 //TARGET_CARBON pt = natural_size(win); ZoomWindowIdeal(win,windowpart,&pt); #else ZoomWindow(win,windowpart,false); #endif inval_grow(win); adjust_scrollers(win,wd->bounds.right,wd->bounds.bottom,wd->hscroll,wd->vscroll); } break; } break; case keyDown: if(e.modifiers & cmdKey){ fixmenus(); do_menu(MenuKey(e.message)); break; } case autoKey: if(win = FrontWindow()){ wd = (wdata*)GetWRefCon(win); switch((char)e.message){ case kHomeCharCode: /* scroll to top of first page */ gotopage(win,0); scroll_home(wd->hscroll,wd->vscroll); break; case kEndCharCode: /* scroll to bottom of last page */ gotopage(win,wd->dircount-1); scroll_end(wd->hscroll,wd->vscroll); break; case kPageUpCharCode: /* scroll up one screenful, or if at top of page, go to bottom of previous page */ if(GetControlValue(wd->vscroll)){ scroll_pagev(wd->hscroll,wd->vscroll,kControlPageUpPart); }else{ gotopage(win,wd->curdir-1); scroll_endv(wd->hscroll,wd->vscroll); } break; case kPageDownCharCode: case ' ': /* scroll down one screenful, or if at bottom of page, go to top of next page */ if(GetControlValue(wd->vscroll) < GetControlMaximum(wd->vscroll)){ scroll_pagev(wd->hscroll,wd->vscroll,kControlPageDownPart); }else{ gotopage(win,wd->curdir+1); scroll_homev(wd->hscroll,wd->vscroll); } break; case kLeftArrowCharCode: gotopage(win,wd->curdir-1); break; case kRightArrowCharCode: gotopage(win,wd->curdir+1); break; case kUpArrowCharCode: scroll_pagev(wd->hscroll,wd->vscroll,kControlUpButtonPart); break; case kDownArrowCharCode: scroll_pagev(wd->hscroll,wd->vscroll,kControlDownButtonPart); break; } } break; case updateEvt: win = (WindowRef)e.message; SetPortWindowPort(win); BeginUpdate(win); draw_window(win,NULL); DrawGrowIcon(win); DrawControls(win); EndUpdate(win); break; case kHighLevelEvent: AEProcessAppleEvent(&e); } /* don't get null events under OS X, so this won't work if(!e.what) InitCursor(); */ } }