Subversion Repositories filter_foundry

Rev

Rev 536 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2.     This file is part of "Filter Foundry", a filter plugin for Adobe Photoshop
  3.     Copyright (C) 2003-2009 Toby Thain, toby@telegraphics.net
  4.     Copyright (C) 2018-2023 Daniel Marschall, ViaThinkSoft
  5.  
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with this program; if not, write to the Free Software
  18.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19. */
  20.  
  21. #include <controls.h>
  22. #include <controldefinitions.h>
  23. #include <dialogs.h>
  24. #include <resources.h>
  25. #include <textutils.h>
  26.  
  27. #include "str.h"
  28.  
  29. #include "ff.h"
  30.  
  31. extern Point preview_scroll;
  32.  
  33. CursHandle handcursor,ibeamcursor;
  34. ControlActionUPP action_UPP,indaction_UPP;
  35. DIALOGREF thedialog;
  36. ControlRef exprctls[4];
  37. int trackingitem;
  38.  
  39. pascal void preview_item(DialogRef dp,DialogItemIndex item);
  40. pascal void slideraction(ControlRef theControl,short partCode);
  41. pascal Boolean sliderfilter(DialogRef dialog,EventRecord *event,short *item);
  42.  
  43. void DoAbout(AboutRecordPtr prec){
  44.         ModalFilterUPP filterproc_UPP = NewModalFilterUPP(aboutfilter);
  45.  
  46.         if(gdata && gdata->parm.standalone){
  47.                 ParamText(myc2pstr(_strdup(gdata->parm.szTitle)), myc2pstr(_strdup(gdata->parm.szAuthor)), myc2pstr(_strdup(gdata->parm.szCopyright)), NULL);
  48.                 Alert(ID_ABOUTSTANDALONEDLG,filterproc_UPP);
  49.         }else
  50.                 Alert(ID_ABOUTDLG,filterproc_UPP);
  51.  
  52.         DisposeModalFilterUPP(filterproc_UPP);
  53. }
  54.  
  55. Boolean simplealert(char *s){
  56.         int i;
  57.  
  58.         myc2pstr(_strdup(s));
  59.         ParamText((StringPtr)s,NULL,NULL,NULL);
  60.         i = StopAlert(ID_SYNTAXALERT,NULL);
  61.         myp2cstr((StringPtr)s);
  62.         return i == ok;
  63. }
  64.  
  65. Boolean simplewarning(char *s){
  66.         int i;
  67.  
  68.         myc2pstr(_strdup(s));
  69.         ParamText((StringPtr)s,NULL,NULL,NULL);
  70.         i = Alert(ID_SYNTAXALERT,NULL);
  71.         myp2cstr((StringPtr)s);
  72.         return i == ok;
  73. }
  74.  
  75. Boolean showmessage(char *s){
  76.         int i;
  77.  
  78.         myc2pstr(_strdup(s));
  79.         ParamText((StringPtr)s,NULL,NULL,NULL);
  80.         i = Alert(ID_SYNTAXALERT,NULL);
  81.         myp2cstr((StringPtr)s);
  82.         return i == ok;
  83. }
  84.  
  85. /*
  86.     NOTE ON CONTROL ACTION PROCS
  87.  
  88.     When using the TrackControl() call when tracking an indicator, the actionProc parameter
  89.     (type ControlActionUPP) should be replaced by a parameter of type DragGrayRgnUPP
  90.     (see Quickdraw.h).
  91.  
  92.     If, however, you are using the live feedback variants of scroll bars or sliders, you
  93.     must pass a ControlActionUPP in when tracking the indicator as well. This functionality
  94.     is available in Appearance 1.0 or later.
  95. */
  96.  
  97. pascal void slideraction(ControlRef theControl,short partCode){
  98.         int old,delta = 0;
  99.  
  100.         ENTERCALLBACK();
  101.  
  102.         if(partCode){
  103.                 if(partCode != kControlIndicatorPart){
  104.                         switch(partCode){
  105.                         case kControlUpButtonPart:   delta = -1; break;
  106.                         case kControlDownButtonPart: delta = 1; break;
  107.                         case kControlPageUpPart:     delta = -SLIDERPAGE; break;
  108.                         case kControlPageDownPart:   delta = SLIDERPAGE; break;
  109.                         }
  110.                         SetControlValue(theControl,(old = GetControlValue(theControl)) + delta);
  111.                 }
  112.                 slidermoved(thedialog,trackingitem);
  113.                 recalc_preview(gpb,thedialog);
  114.         }
  115.  
  116.         EXITCALLBACK();
  117. }
  118.  
  119. pascal Boolean sliderfilter(DialogRef dialog,EventRecord *event,short *item){
  120.         int i;
  121.         short part;
  122.         ControlHandle c;
  123.         Point pt,origscroll,newscroll;
  124.         Boolean result = false,f;
  125.         EventRecord ev;
  126.         GrafPtr oldport;
  127.         ControlRef focus;
  128.  
  129.         ENTERCALLBACK();
  130.  
  131.         GetPort(&oldport);
  132.         SetPortDialogPort(dialog);
  133.  
  134. /* !(result = standardfilter(dialog,event,item)) && */
  135.  
  136.         if( !event->what || (event->what == updateEvt
  137.                                                  && (WindowRef)event->message != GetDialogWindow(dialog)) )
  138.         {       // pass null events and update events to Photoshop
  139.                 gpb->processEvent(event);
  140.         }
  141.         else if(event->what == mouseDown){
  142.  
  143.                 pt = event->where;
  144.                 GlobalToLocal(&pt);
  145.  
  146.                 i = trackingitem = FindDialogItem(dialog,pt)+1;
  147. /*                      if( (c = FindControlUnderMouse(pt,GetDialogWindow(dialog),&part))
  148.                                         && part && HandleControlClick(c,pt,event->modifiers,action_UPP) )*/
  149.                 if( i>=FIRSTCTLITEM && i<=FIRSTCTLITEM+7
  150.                                 && (part = FindControl(pt,GetDialogWindow(dialog),&c))
  151.                                 && TrackControl(c,pt,action_UPP) ){
  152.                         *item = i;
  153.                         result = true;
  154.                 }else if(i == PREVIEWITEM){
  155.                         SetCursor(*handcursor);
  156.                         origscroll = preview_scroll;
  157.                         do{
  158.                                 f = WaitNextEvent(mUpMask,&ev,5,NULL);
  159.                                 newscroll.h = origscroll.h - zoomfactor*(ev.where.h - event->where.h);
  160.                                 newscroll.v = origscroll.v - zoomfactor*(ev.where.v - event->where.v);
  161.                                 if(!EqualPt(newscroll,preview_scroll)){
  162.                                         preview_scroll = newscroll;
  163.                                         recalc_preview(gpb,dialog);
  164.                                 }
  165.                         }while(!f);
  166.  
  167.                         *item = i;
  168.                         result = true;
  169.                 }
  170.  
  171.         }
  172.         else{
  173.                 GetKeyboardFocus(GetDialogWindow(dialog),&focus);
  174.                 /* handle return keypresses */
  175.                 if( event->what == keyDown && (char)event->message == CR
  176.                                 && ( focus==exprctls[0] || focus==exprctls[1]
  177.                                   || focus==exprctls[2] || focus==exprctls[3] ) )
  178.                         result = false;
  179.                 else
  180.                         result = StdFilterProc(dialog,event,item);
  181.         }
  182.  
  183.         SetPort(oldport);
  184.  
  185.         EXITCALLBACK();
  186.  
  187.         return(result);
  188. }
  189.  
  190. Boolean maindialog(FilterRecordPtr pb){
  191.         short itemType, item;
  192.         Handle itemHdl;
  193.         DIALOGREF dp;
  194.         int i;
  195.         UserItemUPP preview_image_UPP = NewUserItemUPP(preview_item);
  196.         ModalFilterUPP sliderfilter_UPP = NewModalFilterUPP(sliderfilter);
  197.  
  198.         action_UPP = NewControlActionUPP(slideraction);
  199.  
  200.         dp = thedialog = GetNewDialog(gdata->parm.standalone ? ID_PARAMDLG : ID_MAINDLG,nil,(WindowPtr)-1);
  201.  
  202.         if(gdata->parm.standalone)
  203.                 SetWTitle(GetDialogWindow(dp), myc2pstr(_strdup(gdata->parm.szTitle)));
  204.  
  205.         GetDialogItem(dp,PREVIEWITEM,&itemType,&itemHdl,&preview_rect);
  206.         SetDialogItem(dp,PREVIEWITEM,itemType,(Handle)preview_image_UPP,&preview_rect);
  207.         handcursor = GetCursor(ID_HANDCURSOR);
  208.         ibeamcursor = GetCursor(iBeamCursor);
  209.  
  210.         SetDialogDefaultItem(dp,ok);
  211.         SetDialogCancelItem(dp,cancel);
  212.         SetDialogTracksCursor(dp,true);
  213.  
  214.         if(!gdata->parm.standalone)
  215.                 for(i = 0; i < 4; ++i)
  216.                         GetDialogItemAsControl(dp,FIRSTEXPRITEM+i,&exprctls[i]);
  217.  
  218.         maindlginit(dp);
  219.         do{
  220.                 InitCursor();
  221.                 ModalDialog(sliderfilter_UPP,&item);
  222.         }while(maindlgitem(dp,item));
  223.  
  224.         DisposeDialog(dp);
  225.  
  226.         DisposeUserItemUPP(preview_image_UPP);
  227.         DisposeModalFilterUPP(sliderfilter_UPP);
  228.         DisposeControlActionUPP(action_UPP);
  229.  
  230.         return item == ok;
  231. }
  232.  
  233. Boolean builddialog(FilterRecordPtr pb){
  234.         short item;
  235.         DIALOGREF dp;
  236.  
  237.         dp = thedialog = GetNewDialog(ID_BUILDDLG,nil,(WindowPtr)-1);
  238.  
  239.         SetDialogDefaultItem(dp,ok);
  240.         SetDialogCancelItem(dp,cancel);
  241.  
  242.         builddlginit(dp);
  243.         do{
  244.                 ModalDialog(NULL,&item);
  245.         }while(builddlgitem(dp,item));
  246.  
  247.         DisposeDialog(dp);
  248.  
  249.         return item == ok;
  250. }
  251.