File:  [Repository] / zogiLib / zogiLib.py
Revision 1.65: download - view: text, annotated - select for diffs - revision graph
Thu Jul 13 20:42:46 2006 UTC (18 years ago) by casties
Branches: MAIN
CVS tags: HEAD
added (side= and bottom=) parameters for img_div

    1: from AccessControl import ClassSecurityInfo
    2: from Globals import package_home
    3: from OFS.Folder import Folder
    4: from OFS.Image import Image
    5: from OFS.Image import File
    6: from OFS.SimpleItem import SimpleItem
    7: from Products.PageTemplates.PageTemplate import PageTemplate
    8: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    9: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
   10: from types import *
   11: from Globals import package_home, ImageFile
   12: from xml_helpers import getUniqueElementText,getText
   13: import cgi
   14: import os
   15: import random
   16: import re
   17: import string
   18: import urllib
   19: import xml.dom.minidom
   20: 
   21: ZOGIVERSION = "0.10.3b ROC 13.7.2006"
   22: 
   23: def cropf(f):
   24:     """returns a float with reduced precision"""
   25:     return float(int(f * 10000)/10000.0)
   26: 
   27: 
   28: def browserCheck(self):
   29:     """check the browsers request to find out the browser type"""
   30:     bt = {}
   31:     ua = self.REQUEST.get_header("HTTP_USER_AGENT")
   32:     bt['ua'] = ua
   33:     bt['isIE'] = False
   34:     bt['isN4'] = False
   35:     if string.find(ua, 'MSIE') > -1:
   36:         bt['isIE'] = True
   37:     else:
   38:         bt['isN4'] = (string.find(ua, 'Mozilla/4.') > -1)
   39:         
   40:     try:
   41:         nav = ua[string.find(ua, '('):]
   42:         ie = string.split(nav, "; ")[1]
   43:         if string.find(ie, "MSIE") > -1:
   44:             bt['versIE'] = string.split(ie, " ")[1]
   45:     except: pass
   46:     
   47:     bt['isMac'] = string.find(ua, 'Macintosh') > -1
   48:     bt['isWin'] = string.find(ua, 'Windows') > -1
   49:     bt['isIEWin'] = bt['isIE'] and bt['isWin']
   50:     bt['isIEMac'] = bt['isIE'] and bt['isMac']
   51:     bt['staticHTML'] = False
   52: 
   53:     return bt
   54: 
   55:     
   56: class zogiImage(SimpleItem):
   57:     """einzelnes Image"""
   58:     meta_type="zogiImage"
   59: 
   60:     manage_options=SimpleItem.manage_options+(
   61:         {'label':'Main config','action':'changeZogiImageForm'},
   62:        )
   63:     
   64:     
   65:     def __init__(self,id,title,baseUrl,queryString,content_type='',precondition=''):
   66:         """init"""
   67:         self.id=id
   68:         self.title=title
   69:         if baseUrl:
   70:             self.baseUrl=baseUrl
   71:         else:
   72:             self.baseUrl="http://nausikaa.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler?"
   73:             
   74:         self.queryString=queryString
   75:         self.content_type=content_type
   76:         self.precondition=precondition
   77: 
   78:     #def getData(self):
   79:     #    """getUrlData"""
   80:     #    return urllib.urlopen(self.baseUrl+self.queryString)
   81: 
   82:     def changeZogiImageForm(self):
   83:         """Main configuration"""
   84:         pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/changeZogiImageForm.zpt')).__of__(self)
   85:         return pt()
   86:     
   87:     def changeZogiImage(self,title,baseUrl, queryString,RESPONSE=None):
   88:         """change it"""
   89:         self.title=title
   90:         self.baseUrl=baseUrl
   91:         self.queryString=queryString
   92: 
   93:         if RESPONSE is not None:
   94:             RESPONSE.redirect('manage_main')
   95: 
   96:     def index_html(self, REQUEST, RESPONSE):
   97:         """service the request by redirecting to digilib server"""
   98:         RESPONSE.redirect(self.baseUrl+self.queryString)
   99:         return ''
  100:         
  101:     def rescale(self,width=None,height=None):
  102:         """andere parameter im querystring"""
  103:         qs=cgi.parse_qs(self.queryString)
  104:         for x in qs.keys():
  105:             if type(qs[x]) is ListType:
  106:                 qs[x]=qs[x][0]
  107:         
  108:         if width:
  109:             qs['dw']=width
  110:         if height:
  111:             qs['dh']=height
  112: 
  113:         
  114:         qsneu=urllib.urlencode(qs)
  115:         self.queryString=qsneu
  116:         return "done"
  117:     
  118: def manage_addZogiImageForm(self):
  119:     """Form for adding"""
  120:     pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/addZogiImage.zpt')).__of__(self)
  121:     return pt()
  122: 
  123: 
  124: def manage_addZogiImage(self,id,title,baseUrl, queryString,RESPONSE=None):
  125:     """add zogiimage"""
  126:     newObj=zogiImage(id,title,baseUrl, queryString)
  127:     self.Destination()._setObject(id,newObj)
  128:     if RESPONSE is not None:
  129:         RESPONSE.redirect('manage_main')
  130: 
  131: 
  132: 
  133: class zogiLib(Folder):
  134:     """digilib frontend with ZOPE"""
  135: 
  136:     meta_type="zogiLib"
  137:     #xxxx
  138:     security=ClassSecurityInfo()
  139:     
  140:     manage_options = Folder.manage_options+(
  141:             {'label':'Main Config','action':'changeZogiLibForm'},
  142:             )
  143: 
  144:     def __init__(self, id, title, dlServerURL, layout="book", basePath="", dlTarget=None, dlToolbarBaseURL=None):
  145:         """init"""
  146: 
  147:         self.id = id
  148:         self.title = title
  149:         self.dlServerURL = dlServerURL
  150:         self.basePath = basePath
  151:         self.layout = layout
  152:         self.dlTarget = dlTarget
  153: 
  154:         if dlToolbarBaseURL:
  155:             self.dlToolbarBaseURL = dlToolbarBaseURL
  156:         else:
  157:             self.dlToolbarBaseURL = dlServerURL + "/digimage.jsp?"
  158:             
  159:         self.manage_addFolder('template')
  160: 
  161: 
  162: # form templates
  163:     main_book      = PageTemplateFile('zpt/main_book', globals())
  164:     main_image     = PageTemplateFile('zpt/main_image', globals())
  165:     main_metaData  = PageTemplateFile('zpt/main_metadata', globals())
  166:     #main_static    = PageTemplateFile('zpt/main_static', globals())
  167:     options        = PageTemplateFile('zpt/options', globals())
  168:     changeForm     = PageTemplateFile('zpt/changeForm', globals())
  169: 
  170: # display templates
  171:     aux_divs       = PageTemplateFile('zpt/aux_divs', globals())
  172:     #aux_divsN4     = PageTemplateFile('zpt/aux_divsN4', globals())
  173:     img_div        = PageTemplateFile('zpt/img_div', globals())
  174:     
  175: # javascripts
  176:     head_js        = PageTemplateFile('zpt/head_js', globals())
  177:     jslib_js       = PageTemplateFile('js/baselib.js', globals())
  178:     dllib_js       = PageTemplateFile('js/dllib.js', globals())
  179:     
  180: # graphic files
  181:     arr_right = ImageFile('images/right.gif', globals())
  182:     arr_left  = ImageFile('images/left.gif', globals())
  183:     arr_up    = ImageFile('images/up.gif', globals())
  184:     arr_down  = ImageFile('images/down.gif', globals())
  185:     mark1     = ImageFile('images/mark1.gif', globals())
  186:     mark2     = ImageFile('images/mark2.gif', globals())
  187:     mark3     = ImageFile('images/mark3.gif', globals())
  188:     mark4     = ImageFile('images/mark4.gif', globals())
  189:     mark5     = ImageFile('images/mark5.gif', globals())
  190:     mark6     = ImageFile('images/mark6.gif', globals())
  191:     mark7     = ImageFile('images/mark7.gif', globals())
  192:     mark8     = ImageFile('images/mark8.gif', globals())
  193:     corner1   = ImageFile('images/olinks.gif', globals())
  194:     corner2   = ImageFile('images/orechts.gif', globals())
  195:     corner3   = ImageFile('images/ulinks.gif', globals())
  196:     corner4   = ImageFile('images/urechts.gif', globals())    
  197: 
  198: 
  199:     security.declareProtected('View','getLayout')
  200:     def getLayout(self):
  201:         """get Layout"""
  202:         return self.layout
  203:     
  204:     def version(self):
  205:         """version information"""
  206:         return ZOGIVERSION
  207: 
  208:     def getContextStatic(self):
  209:         """get all the contexts which go to static pages"""
  210:         
  211:         try:
  212:             dom=xml.dom.minidom.parse(urllib.urlopen(self.getMetaFileName()))
  213:             contexts=dom.getElementsByTagName("context")
  214: 
  215:             ret=[]
  216:             for context in contexts:
  217:                 name=getUniqueElementText(context.getElementsByTagName("name"))
  218: 
  219:                 link=getUniqueElementText(context.getElementsByTagName("link"))
  220:                 if name or link:
  221:                     ret.append((name,link))
  222:             return ret
  223:         except:
  224:             return []
  225: 
  226:     def getContextDatabases(self):
  227:         """get all dynamic contexts"""
  228:         try:
  229:             dom=xml.dom.minidom.parse(urllib.urlopen(self.getMetaFileName()))
  230:             contexts=dom.getElementsByTagName("context")
  231:             ret=[]
  232:             for context in contexts:
  233:                 metaDataLinks=context.getElementsByTagName("meta-datalink")
  234:                 for metaDataLink in metaDataLinks:
  235:                     db=metaDataLink.getAttribute("db")
  236:                     link=self.REQUEST['URL1']+"/dl_db?db=%s"%db
  237:                     if db:
  238:                         ret.append((db,link))
  239:                 metaDataLinks=context.getElementsByTagName("meta-baselink")
  240: 
  241:                 for metaDataLink in metaDataLinks:
  242:                     db=metaDataLink.getAttribute("db")
  243:                     link=self.REQUEST['URL1']+"/dl_db?db=%s"%db
  244:                     if db:
  245:                         ret.append((db,link))
  246: 
  247:             return ret
  248:         except:
  249: 
  250:             return []
  251: 
  252: 
  253:     def formatHTML(self,url,label=None,viewUrl=None):
  254: 
  255:         sets=xml.dom.minidom.parse(urllib.urlopen(url)).getElementsByTagName('dataset')
  256:         ret=""
  257:         #print label
  258:         if label:
  259:             ret+="""<a href="%s">%s</a>"""%(viewUrl,label)
  260:         for set in sets:
  261:             ret+="<table>"
  262:             for node in set.childNodes:
  263:                 if hasattr(node,'tagName'):
  264:                     tag=node.tagName
  265:                     label=node.getAttribute("label")
  266:                     if not label:
  267:                         label=tag
  268:                     text=getText(node.childNodes)
  269:                     ret+="""<tr><td><b>%s:</b></td><td>%s</td></tr>"""%(label,text)
  270:             ret+="</table>"
  271:         return ret
  272: 
  273:     
  274:     def getMetaData(self):
  275:         """getMetaData"""
  276:         try:
  277:             dom=xml.dom.minidom.parse(urllib.urlopen(self.getMetaFileName()))
  278:         except:
  279:             return "error metadata"
  280:         
  281:         contexts=dom.getElementsByTagName("context")
  282:         ret=[]
  283:         db=self.getDLParam("db")
  284:         ob=self.getDLParam("object")
  285:         
  286:         fn=self.getDLParam("fn")
  287:         pn=self.getDLParam("pn")
  288:         if not fn:
  289:             fn=""
  290:         if not pn:
  291:             pn=""
  292:         if not ob:
  293:             ob=""
  294:             
  295:         for context in contexts:
  296:             metaDataLinks=context.getElementsByTagName("meta-datalink")
  297:             for metaDataLink in metaDataLinks:
  298:                  
  299:                 if (db==metaDataLink.getAttribute("db")) or (len(metaDataLinks)==1):
  300:                     
  301:                     link=getUniqueElementText(metaDataLink.getElementsByTagName("metadata-url"))
  302:                     label=getUniqueElementText(metaDataLink.getElementsByTagName("label"))
  303:                     url=getUniqueElementText(metaDataLink.getElementsByTagName("url"))
  304: 
  305:                     return self.formatHTML(link,label,url)
  306: 
  307:             metaDataLinks=context.getElementsByTagName("meta-baselink")
  308:              
  309:             for metaDataLink in metaDataLinks:
  310:                 
  311:                 if db==metaDataLink.getAttribute("db") or (len(metaDataLinks)==1):
  312:                     
  313:                     link=getUniqueElementText(metaDataLink.getElementsByTagName("metadata-url"))
  314:                     label=getUniqueElementText(metaDataLink.getElementsByTagName("label"))
  315:                     url=getUniqueElementText(metaDataLink.getElementsByTagName("url"))
  316: 
  317:                     return self.formatHTML(link+'fn=%s&pn=%s&object=%s'%(fn,pn,ob),label,url)
  318:         return ret
  319: 
  320: 
  321:     def getDLInfo(self):
  322:         """get DLInfo from digilib server"""
  323:         paramH={}
  324:         baseUrl=self.getDLBaseUrl()+"/dlInfo-xml.jsp"
  325:         #print "getdlinfo: ", baseUrl
  326:         try:
  327:             url=urllib.urlopen(baseUrl+'?'+self.getAllDLParams())
  328:             dom=xml.dom.minidom.parse(url)
  329:             params=dom.getElementsByTagName('parameter')
  330:             for param in params:
  331:                 paramH[param.getAttribute('name')]=param.getAttribute('value')
  332:             return paramH
  333:         except:
  334:             return {}
  335: 
  336: 
  337:     def zogilibPath(self, otherbase=None):
  338:         """returns an URL to the zogiLib instance"""
  339:         url = self.REQUEST['URL1']
  340:         # should end with "/"
  341:         if len(url) > 0 and url[-1] != '/':
  342:             url += '/'
  343:         if type(otherbase) is str:
  344:             url += otherbase
  345:         else:
  346:             url += self.basePath
  347:         # should still end with "/"
  348:         if len(url) > 0 and url[-1] != '/':
  349:             url += '/'
  350:         return url
  351: 
  352:     def zogilibAction(self, action, otherbase=None):
  353:         """returns a URL with zogilib path and action"""
  354:         url = self.zogilibPath(otherbase)
  355:         url += action
  356:         url += '?' + self.getAllDLParams();
  357:         return url
  358:     
  359:     def getDLBaseUrl(self):
  360:         """returns digilib base URL (sans servlet path)"""
  361:         if self.dlServerURL[-1] == '?':
  362:             # full Servlet URL -- remove last part
  363:             si = self.dlServerURL.rindex('/servlet/')
  364:             if si > 0:
  365:                 return self.dlServerURL[:si]
  366:             else:
  367:                 # no servlet part :-(
  368:                 return "http://nausikaa.mpiwg-berlin.mpg.de/digitallibrary"
  369:         else:
  370:             return self.dlServerURL 
  371:         
  372: 
  373:     def getScalerUrl(self,requestString=""):
  374:         """send scaler url"""
  375:         if self.dlServerURL[-1] == '?':
  376:             # full Servlet URL
  377:             return self.dlServerURL + requestString
  378:         else:
  379:             return self.dlServerURL+'/servlet/Scaler?'+requestString
  380:     
  381:     def scaledImage(self,requestString=None):
  382:         """scaled Image"""
  383:         
  384:         if not requestString:
  385:             requestString=self.REQUEST['QUERY_STRING']
  386:             
  387:         self.REQUEST.RESPONSE.redirect(self.getScalerUrl(requestString))
  388:         
  389:         return True
  390:     
  391:         
  392:     def createScalerImg(self, requestString=None, bottom=0, side=0, width=500, height=500, options=None):
  393:         """generate Scaler IMG Tag"""
  394:         self.checkQuery()
  395:         bt = self.getBrowserType()
  396:         # override with parameters from session
  397:         if  self.REQUEST.SESSION.has_key('scalerDiv'):
  398:             (requestString, bottom, side, width, height) = self.REQUEST.SESSION['scalerDiv']
  399:         # if not explicitly defined take normal request
  400:         if not requestString:
  401:             requestString = self.getAllDLParams()
  402:         url = self.getScalerUrl(requestString=requestString)
  403:         # take insets from options if present
  404:         if options is not None:
  405:             side = options.get('side', side)
  406:             bottom = options.get('bottom', bottom)
  407:         # construct bottom and side insets
  408:         b_par = ""
  409:         s_par = ""
  410:         if (bottom != 0) or (side != 0):
  411:             b_par = "-" + str(int(bottom))
  412:             s_par = "-" + str(int(side))
  413:         tag = ""
  414:         if bt['staticHTML']:
  415:             tag += '<div id="scaler"><img id="pic" src="%s&dw=%i&dh=%i" /></div>'%(url, int(width-side), int(height-bottom))
  416:         else:
  417:             if bt['isN4']:
  418:                 # N4 needs layers
  419:                 tag += '<ilayer id="scaler">'
  420:             else:
  421:                 tag += '<div id="scaler">'
  422:             tag += '<script type="text/javascript">'
  423:             tag += "var ps = bestPicSize(getElement('scaler'));"
  424:             # write img tag with javascript
  425:             tag += 'document.write(\'<img id="pic" src="%s&dw=\'+(ps.width%s)+\'&dh=\'+(ps.height%s)+\'" />\');'%(url, s_par, b_par)
  426:             tag += '</script>'
  427:             if bt['isN4']:
  428:                 tag += '</ilayer>'
  429:             else:
  430:                 tag += '</div>'
  431:         return tag
  432: 
  433:     def createScalerDiv(self, requestString = None, bottom = 0, side = 0, width=500, height=500):
  434:         """generate scaler img and table with navigation arrows"""
  435:         self.checkQuery()
  436:         if requestString != None or bottom != 0 or side != 0:
  437:             self.REQUEST.SESSION['scalerDiv'] = (requestString, bottom, side, width, height)
  438:         else:
  439:             if self.REQUEST.SESSION.has_key('scalerDiv'):
  440:                 # make shure to remove unused parameter
  441:                 del self.REQUEST.SESSION['scalerDiv']
  442:                 
  443:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/zogilib_img_div')).__of__(self)
  444:         return pt()
  445: 
  446:     def index_html(self):
  447:         """main action"""
  448:         self.checkQuery()
  449:         tp = "main_template"
  450:         tpt = self.layout
  451:         
  452:         if not hasattr(self, 'template'):
  453:             # create template folder if it doesn't exist
  454:             print "no template folder -- creating"
  455:             self.manage_addFolder('template')
  456:             
  457:         pt = getattr(self.template, 'main_'+tpt)
  458:         return pt()
  459: 
  460:     def checkQuery(self):
  461:         """make shure that the query has been saved"""
  462:         if not self.REQUEST.has_key('dlParams'):
  463:             self.storeQuery()
  464: 
  465:     def storeQuery(self, more=None, withpt=False):
  466:         """parse query parameters into a hash in REQUEST"""
  467:         params = {}
  468:         for fm in self.REQUEST.form.keys():
  469:             params[fm] = self.REQUEST.form[fm]
  470:         # look for more
  471:         if more:
  472:             for fm in more.split('&'):
  473:                 try:
  474:                     pv = fm.split('=')
  475:                     params[pv[0]] = pv[1]
  476:                 except:
  477:                     pass
  478:                 
  479:         # parse digilib mode parameter
  480:         if 'mo' in params:
  481:             if len(params['mo']) > 0:
  482:                 modes=params['mo'].split(',')
  483:         else:
  484:             modes = [];
  485: 
  486:         self.REQUEST.set('dlParams', params)
  487:         self.REQUEST.set('dlModes', modes)
  488:         
  489:         # trigger get pt (from dlInfo) if requested
  490:         if withpt:
  491:             pt = self.getPT()
  492:             
  493:         return params
  494:         
  495: 
  496:     def getDLParam(self, param, default=None):
  497:         """returns parameter or default"""
  498:         self.checkQuery()
  499:         dlParams = self.REQUEST.get('dlParams')
  500:         try:
  501:             return dlParams[param]
  502:         except:
  503:             return default
  504: 
  505:     def setDLParam(self, param, value):
  506:         """sets parameter"""
  507:         self.checkQuery()
  508:         dlParams = self.REQUEST.get('dlParams')
  509:         dlParams[param] = value
  510:         return
  511: 
  512:     def getAllDLParams(self):
  513:         """parameter string for digilib"""
  514:         self.checkQuery()
  515:         dlParams = self.REQUEST.get('dlParams')
  516:         # save modes
  517:         modes = self.REQUEST.get('dlModes')
  518:         if modes:
  519:             dlParams['mo'] = string.join(modes, ',')
  520:         # assemble query string
  521:         ret = ""
  522:         for param in dlParams.keys():
  523:             if dlParams[param] is None: continue
  524:             val = str(dlParams[param])
  525:             if val != "":
  526:                 ret += param + "=" + val + "&"
  527: 
  528:         # omit trailing "&"
  529:         return ret.rstrip('&')
  530:         
  531:     def setDLParams(self,pn=None,ws=None,rot=None,brgt=None,cont=None):
  532:         """setze Parameter"""
  533: 
  534:         self.setDLParam('brgt', brgt)
  535:         self.setDLParam('cont', cont)
  536:         self.setDLParam('ws', ws)
  537:         self.setDLParam('rot', rot)
  538: 
  539:         if pn:
  540:             # unmark
  541:             self.setDLParam('mk', None)
  542:             self.setDLParam('pn', pn)
  543:             
  544:         return self.display()
  545: 
  546:     def getBrowserType(self):
  547:         """get browser type object"""
  548:         if self.REQUEST.SESSION.has_key('browserType'):
  549:             return self.REQUEST.SESSION['browserType']
  550:         else:
  551:             bt = browserCheck(self)
  552:             self.REQUEST.SESSION.set('browserType', bt)                        
  553:             return bt
  554: 
  555: 
  556:     def display(self):
  557:         """(re)display page"""
  558:         params = self.getAllDLParams()
  559:             
  560:         if self.basePath:
  561:             self.REQUEST.RESPONSE.redirect(self.REQUEST['URL2']+'?'+params)
  562:         else:
  563:             self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+params)
  564: 
  565:     def getMetaFileName(self):
  566:         url=self.dlServerURL+'/dlContext-xml.jsp?'+self.getAllDLParams()
  567:         return urlbase
  568: 
  569:     def getToolbarPageURL(self):
  570:         """returns a toolbar-enabled page URL"""
  571:         url=self.dlToolbarBaseURL+self.getAllDLParams()
  572:         return url
  573:     
  574:     def getDLTarget(self):
  575:         """returns dlTarget"""
  576:         self.checkQuery()
  577:         s = self.dlTarget
  578:         if (s is None) or (s == ""):
  579: #            s = ""
  580:             s = 'dl'
  581:             if self.getDLParam('fn'):
  582:                 s += "_" + self.getDLParam('fn')
  583:             if self.getDLParam('pn'):
  584:                 s += "_" + self.getDLParam('pn')
  585: 
  586:         return s
  587: 
  588:     def getPN(self):
  589:         """pagenumber"""
  590:         pn = int(self.getDLParam('pn', 1))
  591:         return pn
  592:     
  593:     def getPT(self):
  594:         """number of total pages"""
  595:         pt = self.getDLParam('pt', None)
  596:         if pt is None:
  597:             # get pt from dlInfo
  598:             if self.REQUEST.has_key('dlInfo'):
  599:                 info = self.REQUEST.get('dlInfo')
  600:             else:
  601:                 info = self.getDLInfo()
  602:                 self.REQUEST.set('dlInfo', info)
  603:             pt = int(info.get('pt', 1))
  604:             self.setDLParam('pt', pt)
  605:         return int(pt)
  606:     
  607:     def hasMode(self, mode):
  608:         """returns if mode is in the diglib mo parameter"""
  609:         return (mode in self.REQUEST.get('dlModes'))
  610: 
  611:     def hasNextPage(self):
  612:         """returns if there is a next page"""
  613:         pn = self.getPN()
  614:         pt = self.getPT()
  615:         return (pn < pt)
  616:    
  617:     def hasPrevPage(self):
  618:         """returns if there is a previous page"""
  619:         pn = self.getPN()
  620:         return (pn > 1)
  621: 
  622:     def canMoveLeft(self):
  623:         """returns if its possible to move left"""
  624:         wx = float(self.getDLParam('wx') or 0)
  625:         return (wx > 0)
  626: 
  627:     def canMoveRight(self):
  628:         """returns if its possible to move right"""
  629:         wx = float(self.getDLParam('wx') or 0)
  630:         ww = float(self.getDLParam('ww') or 1)
  631:         return (wx + ww < 1)
  632: 
  633:     def canMoveUp(self):
  634:         """returns if its possible to move up"""
  635:         wy = float(self.getDLParam('wy') or 0)
  636:         return (wy > 0)
  637: 
  638:     def canMoveDown(self):
  639:         """returns if its possible to move down"""
  640:         wy = float(self.getDLParam('wy') or 0)
  641:         wh = float(self.getDLParam('wh') or 1)
  642:         return (wy + wh < 1)
  643: 
  644: 
  645:     def dl_StaticHTML(self):
  646:         """set rendering to static HTML"""
  647:         self.checkQuery()
  648:         self.getBrowserType()['staticHTML'] = True
  649:         return self.display()
  650: 
  651:     def dl_DynamicHTML(self):
  652:         """set rendering to dynamic HTML"""
  653:         self.checkQuery()
  654:         self.getBrowserType()['staticHTML'] = False
  655:         return self.display()
  656:         
  657:     def dl_HMirror(self):
  658:         """mirror action"""
  659:         modes = self.getSubSession('dlModes')
  660:         if 'hmir' in modes:
  661:             modes.remove('hmir')
  662:         else:
  663:             modes.append('hmir')
  664: 
  665:         return self.display()
  666:        
  667:     def dl_VMirror(self):
  668:         """mirror action"""
  669:         modes = self.getSubSession('dlModes')
  670:         if 'vmir' in modes:
  671:             modes.remove('vmir')
  672:         else:
  673:             modes.append('vmir')
  674: 
  675:         return self.display()
  676: 
  677:     def dl_Zoom(self, z):
  678:         """general zoom action"""
  679:         ww1 = float(self.getDLParam('ww') or 1)
  680:         wh1 = float(self.getDLParam('wh') or 1)
  681:         wx = float(self.getDLParam('wx') or 0)
  682:         wy = float(self.getDLParam('wy') or 0)
  683:         ww2 = ww1 * z
  684:         wh2 = wh1 * z
  685:         wx += (ww1 - ww2) / 2
  686:         wy += (wh1 - wh2) / 2
  687:         ww2 = max(min(ww2, 1), 0)
  688:         wh2 = max(min(wh2, 1), 0)
  689:         wx = max(min(wx, 1), 0)
  690:         wy = max(min(wy, 1), 0)
  691:         self.setDLParam('ww', cropf(ww2))
  692:         self.setDLParam('wh', cropf(wh2))
  693:         self.setDLParam('wx', cropf(wx))
  694:         self.setDLParam('wy', cropf(wy))
  695:         return self.display()
  696:         
  697:     def dl_ZoomIn(self):
  698:         """zoom in action"""
  699:         z = 0.7071
  700:         return self.dl_Zoom(z)
  701: 
  702:     def dl_ZoomOut(self):
  703:         """zoom out action"""
  704:         z = 1.4142
  705:         return self.dl_Zoom(z)
  706: 
  707:     def dl_Move(self, dx, dy):
  708:         """general move action"""
  709:         ww = float(self.getDLParam('ww') or 1)
  710:         wh = float(self.getDLParam('wh') or 1)
  711:         wx = float(self.getDLParam('wx') or 0)
  712:         wy = float(self.getDLParam('wy') or 0)
  713:         wx += dx * 0.5 * ww
  714:         wy += dy * 0.5 * wh
  715:         wx = max(min(wx, 1), 0)
  716:         wy = max(min(wy, 1), 0)
  717:         self.setDLParam('wx', cropf(wx))
  718:         self.setDLParam('wy', cropf(wy))
  719:         return self.display()
  720:         
  721:     def dl_MoveLeft(self):
  722:         """move left action"""
  723:         return self.dl_Move(-1, 0)
  724:     
  725:     def dl_MoveRight(self):
  726:         """move left action"""
  727:         return self.dl_Move(1, 0)
  728:     
  729:     def dl_MoveUp(self):
  730:         """move left action"""
  731:         return self.dl_Move(0, -1)
  732:     
  733:     def dl_MoveDown(self):
  734:         """move left action"""
  735:         return self.dl_Move(0, 1)
  736:     
  737:     def dl_WholePage(self):
  738:         """zoom out action"""
  739:         self.setDLParam('ww', 1)
  740:         self.setDLParam('wh', 1)
  741:         self.setDLParam('wx', 0)
  742:         self.setDLParam('wy', 0)
  743:         return self.display()
  744:         
  745:     def dl_PrevPage(self):
  746:         """next page action"""
  747:         pn = self.getPN() - 1
  748:         if pn < 1:
  749:             pn = 1
  750:         self.setDLParam('pn', pn)
  751:         # unmark
  752:         self.setDLParam('mk', None)
  753:         return self.display()
  754:         
  755:     def dl_NextPage(self):
  756:         """next page action"""
  757:         pn = self.getPN() + 1
  758:         pt = self.getPT()
  759:         if pn > pt:
  760:             pn = pt
  761:         self.setDLParam('pn', pn)
  762:         # unmark
  763:         self.setDLParam('mk', None)
  764:         return self.display()
  765: 
  766:     def dl_FirstPage(self):
  767:         """first page action"""
  768:         self.setDLParam('pn', 1)
  769:         # unmark
  770:         self.setDLParam('mk', None)
  771:         return self.display()
  772:     
  773:     def dl_LastPage(self):
  774:         """last page action"""
  775:         self.setDLParam('pn', self.getPT())
  776:         # unmark
  777:         self.setDLParam('mk', None)
  778:         return self.display()
  779: 
  780:     def dl_db(self,db):
  781:         """set db"""
  782:         self.setDLParam('db',db)
  783:         self.display()
  784: 
  785:     def changeZogiLibForm(self):
  786:         """Main configuration"""
  787:         pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/changeZogiLibForm.zpt')).__of__(self)
  788:         return pt()
  789:     
  790:     def changeZogiLib(self,title,dlServerURL, version, basePath, dlTarget, dlToolbarBaseURL, RESPONSE=None):
  791:         """change it"""
  792:         self.title=title
  793:         self.dlServerURL=dlServerURL
  794:         self.basePath = basePath
  795:         self.layout=version
  796:         self.dlTarget = dlTarget
  797: 
  798:         if dlToolbarBaseURL:
  799:             self.dlToolbarBaseURL = dlToolbarBaseURL
  800:         else:
  801:             self.dlToolbarBaseURL = dlServerURL + "/digimage.jsp?"
  802: 
  803:         if RESPONSE is not None:
  804:             RESPONSE.redirect('manage_main')
  805: 
  806: 
  807: 
  808:     ##
  809:     ## odds and ends
  810:     ##
  811: 
  812:     def repairZogilib(self, obj=None):
  813:         """change stuff that broke on upgrading"""
  814: 
  815:         msg = ""
  816: 
  817:         if not obj:
  818:             obj = self.getPhysicalRoot()
  819: 
  820:         print "starting in ", obj
  821:         
  822:         entries=obj.ZopeFind(obj,obj_metatypes=['zogiLib'],search_sub=1)
  823: 
  824:         for entry in entries:
  825:             print "  found ", entry
  826:             #
  827:             # replace digilibBaseUrl by dlServerURL
  828:             if hasattr(entry[1], 'digilibBaseUrl'):
  829:                 msg += "  fixing digilibBaseUrl in "+entry[0]+"\n"
  830:                 entry[1].dlServerURL = re.sub('/servlet/Scaler\?','',entry[1].digilibBaseUrl)
  831:                 del entry[1].digilibBaseUrl
  832:                 
  833:             #
  834:             # add dlToolbarBaseURL
  835:             if not hasattr(entry[1], 'dlToolbarBaseURL'):
  836:                 msg += "  fixing dlToolbarBaseURL in "+entry[0]+"\n"
  837:                 entry[1].dlToolbarBaseURL = entry[1].dlServerURL + "/digimage.jsp?"
  838:                 
  839:         return msg+"\n\nfixed all zogilib instances in: "+obj.title
  840: 
  841:           
  842: def manage_addZogiLibForm(self):
  843:     """interface for adding zogilib"""
  844:     pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/addZogiLibForm')).__of__(self)
  845:     return pt()
  846: 
  847: def manage_addZogiLib(self,id,title,dlServerURL,version="book",basePath="",dlTarget=None,dlToolbarBaseURL=None,RESPONSE=None):
  848:     """add dgilib"""
  849:     newObj=zogiLib(id,title,dlServerURL, version, basePath, dlTarget, dlToolbarBaseURL)
  850:     self.Destination()._setObject(id,newObj)
  851:     if RESPONSE is not None:
  852:         RESPONSE.redirect('manage_main')
  853: 
  854: 
  855: class zogiLibPageTemplate(ZopePageTemplate):
  856:     """pageTemplate Objekt"""
  857:     meta_type="zogiLib_pageTemplate"
  858: 
  859: 
  860: ## def __init__(self, id, text=None, contentType=None):
  861: ##         self.id = str(id)
  862: ##         self.ZBindings_edit(self._default_bindings)
  863: ##         if text is None:
  864: ##             text = open(self._default_cont).read()
  865: ##         self.pt_edit(text, contentType)
  866: 
  867: def manage_addZogiLibPageTemplateForm(self):
  868:     """Form for adding"""
  869:     pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/addZogiLibPageTemplateForm')).__of__(self)
  870:     return pt()
  871: 
  872: def manage_addZogiLibPageTemplate(self, title=None, layout=None, text=None,
  873:                            REQUEST=None, submit=None):
  874:     "Add a Page Template with optional file content."
  875: 
  876:     if not layout: layout = "book"
  877:     id = 'main_%s'%layout
  878:     self._setObject(id, zogiLibPageTemplate(id))
  879:     ob = getattr(self, id)
  880:     ob.pt_edit(open(os.path.join(package_home(globals()),'zpt/main_%s.zpt'%layout)).read(),None)
  881:     if title:
  882:         ob.pt_setTitle(title)
  883:     try:
  884:         url = self.DestinationURL()
  885:     except AttributeError:
  886:         url = REQUEST['URL1']
  887:         
  888:     url = "%s/%s" % (url, urllib.quote(id))
  889:     REQUEST.RESPONSE.redirect(url+'/manage_main')
  890:     return ''
  891: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>