#VRML V2.0 utf8 PROTO TextElement[ exposedField SFString text "" exposedField SFString uri "" exposedField SFString email "" exposedField SFString webpage "" exposedField SFString style "PLAIN" exposedField SFString color "black" ]{} PROTO LineElement[ exposedField MFNode line [] ]{} PROTO TextLineElement[ exposedField MFString text [] exposedField SFVec3f translation 0 0 0 field SFString textFont "fonts/aerial.bmp" field SFString style "PLAIN" field MFString family ["TEXTURE 0 255 16 16 0.625 0 0"] field SFFloat fontSize 1 eventIn SFString uri eventIn SFString email eventIn SFString webpage eventIn SFNode addURLHandler eventIn SFFloat setYPos ] { DEF textTransform Transform { translation IS translation children [ Shape { appearance DEF fontAppearance Appearance { texture ImageTexture {} } geometry DEF textNode Text { string IS text fontStyle FontStyle { family IS family style IS style size IS fontSize } } } ] } Script { directOutput TRUE field SFNode textTransform USE textTransform eventIn SFString uri IS uri eventIn SFString email IS email eventIn SFString webpage IS webpage eventIn SFNode addUrlHandler IS addURLHandler eventIn SFTime wordClicked eventIn SFBool wordButtonDown eventOut SFString sendURI eventOut SFString sendURIemail eventOut SFString sendURIwebpage eventOut SFString sendActiveURI eventIn SFFloat setYPos IS setYPos field SFString textFont IS textFont field SFBool linked FALSE field SFBool is_email FALSE field SFNode fontAppearance USE fontAppearance url "javascript: function initialize() { //var fontTexture; //if(linked) fontTexture=linkFont; //else fontTexture=textFont; fontAppearance.texture = new SFNode('ImageTexture { url \"'+textFont+'\" } '); // standaard font } function setYPos(pos) { textTransform.translation.y=pos; } function wordClicked() { if (uri !=''){ sendURI = uri; } else if (email !=''){ sendURIemail = email; } else if (webpage !=''){ sendURIwebpage = webpage; } } function wordButtonDown(down) { if(!down) return; sendActiveURI=uri; } function addUrlHandler(value) { if(uri !=''|| email !='' || webpage !='') { var sensor = Browser.createVrmlFromString('TouchSensor{}'); textTransform.addChildren = sensor; Browser.addRoute(sensor[0],'touchTime',Browser.getScript(),'wordClicked'); Browser.addRoute(sensor[0],'isActive',Browser.getScript(),'wordButtonDown'); Browser.addRoute(Browser.getScript(),'sendURI',value,'uriClicked'); Browser.addRoute(Browser.getScript(),'sendURIemail',value,'emailClicked'); Browser.addRoute(Browser.getScript(),'sendURIwebpage',value,'webpageClicked'); Browser.addRoute(Browser.getScript(),'sendActiveURI',value,'uriActive'); linked=true; } } " } } PROTO ScrollPane [ field SFInt32 maxCharsOnALine 55 field SFFloat charAspect 0.5 field SFFloat minMargin 0.03 field SFFloat lineSpacing 1 field SFFloat charSpacing 1 field SFString textFont "fonts/aerial.bmp" field SFString blueFont "fonts/aerial_blue.bmp" field SFString redFont "fonts/aerial_red.bmp" field SFString greenFont "fonts/aerial_green.bmp" field SFString linkFont "fonts/aerial_link.bmp" field SFString boldFont "fonts/aerial_bold.bmp" eventIn SFString loadURL eventIn SFString setText eventIn SFInt32 scrollText eventOut SFString linkClicked eventOut SFString activeLink # eventOut SFString emailClicked ] { DEF BoxTransform Transform { children [ Transform { translation -0.015 0 0 children Shape { geometry Box { size 0.97 1 0 } appearance Appearance { material DEF backgroundColor Material { diffuseColor 1 1 1 } } } } Transform { translation 0.485 0 0 children [ Transform { translation 0 0.485 0 children [ DEF UP TouchSensor {} DEF boxShape Shape { geometry Box { size .03 .03 0 } appearance Appearance { material Material { diffuseColor 0 0 0 emissiveColor 0 .0353 0 specularColor 0 0 1 ambientIntensity 0 shininess 0 } } } Transform { scale .028 .028 0.028 children DEF arrowShape Shape { geometry Extrusion { crossSection [-0.5 0.5, 0.5 0.5, 0 -0.5,-0.5 0.5] spine [0 0 -0.03, 0 0 0.03] } appearance DEF arrowAppearance Appearance { material Material { diffuseColor .169 .31 .329 specularColor .04 .06 .83 ambientIntensity 0 shininess 0 } } } } ] } Transform { translation 0 -0.485 0 children [ DEF DOWN TouchSensor {} USE boxShape Transform { rotation 0 0 1 3.14159265358979 scale .028 .028 0.028 children USE arrowShape } ] } Group { children [ DEF scrollbarSensor TouchSensor {} DEF scrollSensor PlaneSensor { maxPosition 0 0.455 minPosition 0 -0.455 offset 0 0.455 0 } Shape { geometry Box { size .03 0.94 0 } appearance Appearance { material Material { diffuseColor 0 0 0 specularColor .04 .06 .83 ambientIntensity .039 shininess 0 } } } DEF scrollTransform Transform { translation 0 0.455 0 children [ DEF scrollSwitch Switch { whichChoice 0 choice Shape { geometry Sphere { radius 0.015 } appearance USE arrowAppearance } } ] ROUTE scrollSensor.translation_changed TO scrollTransform.translation } ] } ] } ] } DEF group Transform{} DEF TIMER TimeSensor {loop TRUE enabled FALSE cycleInterval 0.15} DEF S1 Script { directOutput TRUE field SFNode world USE BoxTransform field SFNode scrollTransform USE scrollTransform field SFNode scrollSensor USE scrollSensor field SFNode scrollbarSensor USE scrollbarSensor field SFNode group USE group field SFNode scrollSwitch USE scrollSwitch field SFString textFont IS textFont field SFString linkFont IS linkFont field SFString blueFont IS blueFont field SFString greenFont IS greenFont field SFString redFont IS redFont field SFString boldFont IS boldFont field SFInt32 maxCharsOnALine IS maxCharsOnALine field SFFloat charAspect IS charAspect field SFFloat lineSpacing IS lineSpacing field SFFloat charSpacing IS charSpacing field SFFloat minMargin IS minMargin field SFFloat charHeight 0 field SFFloat charWidth 0 field SFFloat marginX 0 field SFFloat marginY 0 field SFInt32 pageLength 0 field SFInt32 lastPosition 0 field SFFloat maxScrollY 0.455 field SFFloat scrollBarWidth 0.03 eventIn SFString loadURL IS loadURL eventIn SFString setText IS setText eventOut SFString linkClicked IS linkClicked eventOut SFString activeLink IS activeLink # eventOut SFString emailClicked IS emailClicked field MFNode inputText [] eventIn SFTime time eventOut SFBool timerEnabled eventOut SFTime timerStartTime eventOut SFColor backgroundColor field MFNode lines [] field MFNode currentLines [] field SFBool direction TRUE eventIn SFString uriClicked eventIn SFString uriActive eventIn SFString emailClicked eventIn SFString webpageClicked eventIn SFBool up eventIn SFBool down eventIn SFVec3f scrollChanged eventIn SFBool scrollbarClicked eventIn SFInt32 scrollText IS scrollText field SFInt32 position 0 url "javascript: function initialize() { // maxCharsOnALine*charWidth+ <-- room needed for letters // (maxCharsOnALine-1)*(charSpacing-1)*charWidth <-- room needed for spacing // =1-(2*minMargin)-scrollBarWidth <-- total room available charWidth=(1-(2*minMargin)-scrollBarWidth)/(maxCharsOnALine+(maxCharsOnALine-1)*(charSpacing-1)); charHeight=charWidth/charAspect; //pageLength*charHeight+(pageLength-1)*(lineSpacing-1)*charHeight<=1-(2*minMargin) pageLength=(((1-(2*minMargin))/charHeight)+lineSpacing-1)/lineSpacing; if(pageLength<1) { pageLength=1; if(1-(2*minMargin)-charHeight<0) { charHeight=1-(2*minMargin); charWidth=charHeight*charAspect; } } marginX=((1-scrollBarWidth)-(maxCharsOnALine*charSpacing*charWidth)+((charSpacing-1)*charWidth))/2; marginY=(1-(pageLength*lineSpacing*charHeight)+((lineSpacing-1)*charHeight))/2; if(marginX<0) marginX=0; if(marginY<0) marginY=0; if(linkFont=='fonts/aerial_link_black.bmp')backgroundColor= new SFColor(0,0,0); else backgroundColor= new SFColor(1,1,1); } function loadURL(url) { //print('loading url' +url); // Browser.loadURL('javascript:loadNewURL(\"'+url+'\");'); } function setText(text) { createTextNodes(text); setTextNodes(); position=0; if(lines.length<=pageLength) { scrollSwitch.whichChoice=-1; } else { scrollSwitch.whichChoice=0; resetScrollerTranslation(); } } function setTextNodes() { //print(maxCharsOnALine); createTextLines(); group.children = new MFNode(); for(i=0;i< pageLength;i++) { if(i>=lines.length) break; group.addChildren = lines[i].line; //position++; } lastPosition=lines.length-pageLength; } function createTextNodes(text) { //var text = 'bla g [[interview het interview]] bla'; text=text+'\n'; //print (text); var textElement; var currentText = ''; var paragraphLength=0; var lineLength=0; inputText = new MFNode(); inputText[0] = Browser.createVrmlFromString( 'LineElement {}')[0]; //setText = new MFNode(); for(i=0;i< text.length;i++) { var character = text.charAt(i); //print(character); if(character=='\n') { style=''; //print(paragraphLength); //print(lineLength); textElement = Browser.createVrmlFromString('TextElement {}')[0]; textElement.text=currentText; textElement.style=style; inputText[paragraphLength].line[lineLength] = textElement; paragraphLength++; if(i!=text.length-1) { //start the next LineElement lineLength=0; currentText = ''; inputText[paragraphLength] = Browser.createVrmlFromString( 'LineElement {}')[0]; } } else if(character=='[') { if(text.charAt(i+1) =='[') {//link style=''; textElement = Browser.createVrmlFromString('TextElement {}')[0]; textElement.text=currentText; inputText[paragraphLength].line[lineLength] = textElement; //print('('+currentText +')'); currentText=''; lineLength++; var uri=''; var uriText=''; for(j=i+2;j< text.length;j++) // uri - location { if(text.charAt(j) ==' ') break; else uri +=text.charAt(j); } for(j=j+1;j< text.length;j++) // uri text { if(text.charAt(j) ==']') break; else uriText +=text.charAt(j); } i=j+1; //inputText[paragraphLength].line[lineLength] = Browser.createVrmlFromString( 'TextElement {text \"' + uriText + '\" uri \"' + uri + '\" style \"' + style + '\"}')[0]; textElement = Browser.createVrmlFromString('TextElement {}')[0]; textElement.text=uriText; textElement.uri=uri; //print('textElement.uri=uri'+ textElement.uri); textElement.style=style; inputText[paragraphLength].line[lineLength]=textElement; lineLength++; } else currentText+=character; } else if(character=='$') { if(text.charAt(i+1) =='$') {//email style=''; textElement = Browser.createVrmlFromString('TextElement {}')[0]; textElement.text=currentText; inputText[paragraphLength].line[lineLength] = textElement; //print('('+currentText +')'); currentText=''; lineLength++; var uri=''; var uriText=''; for(j=i+2;j< text.length;j++) { if(text.charAt(j) ==' ') break; else uri +=text.charAt(j); } for(j=j+1;j< text.length;j++) { if(text.charAt(j) =='$') break; else uriText +=text.charAt(j); } i=j+1; //inputText[paragraphLength].line[lineLength] = Browser.createVrmlFromString( 'TextElement {text \"' + uriText + '\" uri \"' + uri + '\" style \"' + style + '\"}')[0]; textElement = Browser.createVrmlFromString('TextElement {}')[0]; textElement.text=uriText; textElement.email=uri; //print('textElement.email=uri'+ textElement.email); textElement.style=style; inputText[paragraphLength].line[lineLength]=textElement; lineLength++; } else currentText+=character; } else if(character=='#') { if(text.charAt(i+1) =='#') {//extern URL style=''; textElement = Browser.createVrmlFromString('TextElement {}')[0]; textElement.text=currentText; inputText[paragraphLength].line[lineLength] = textElement; //print('('+currentText +')'); currentText=''; lineLength++; var uri=''; var uriText=''; for(j=i+2;j< text.length;j++) { if(text.charAt(j) ==' ') break; else uri +=text.charAt(j); } for(j=j+1;j< text.length;j++) { if(text.charAt(j) =='#') break; else uriText +=text.charAt(j); } i=j+1; //inputText[paragraphLength].line[lineLength] = Browser.createVrmlFromString( 'TextElement {text \"' + uriText + '\" uri \"' + uri + '\" style \"' + style + '\"}')[0]; textElement = Browser.createVrmlFromString('TextElement {}')[0]; textElement.text=uriText; textElement.webpage=uri; //print('textElement.webpage=uri'+ textElement.webpage); textElement.style=style; inputText[paragraphLength].line[lineLength]=textElement; lineLength++; } else currentText+=character; } else if(character=='%') { var color = containsColor(text,i+1); if(color!='') {//color colorSize= color.length+3; style=''; textElement = Browser.createVrmlFromString('TextElement {}')[0]; textElement.text=currentText; inputText[paragraphLength].line[lineLength] = textElement; //print('('+currentText +')'); currentText=''; lineLength++; var colorText=''; for(j=i+colorSize;j< text.length;j++) { if(text.charAt(j) == '\n') break; if (text.charAt(j) =='%' && text.charAt(j+1) =='%') { j++; break; } else colorText +=text.charAt(j); } i=j+1; //inputText[paragraphLength].line[lineLength] = Browser.createVrmlFromString( 'TextElement {text \"' + uriText + '\" uri \"' + uri + '\" style \"' + style + '\"}')[0]; textElement = Browser.createVrmlFromString('TextElement {}')[0]; textElement.text=colorText; textElement.color=color; textElement.style=style; inputText[paragraphLength].line[lineLength]=textElement; lineLength++; } else currentText+=character; } else currentText+=character; } } function containsColor(text,pointer) { if (containsColor2(text,'red%',pointer)) return 'red'; else if (containsColor2(text,'blue%',pointer)) return 'blue'; else if (containsColor2(text,'green%',pointer)) return 'green'; else if (containsColor2(text,'bold%',pointer)) return 'bold'; return ''; } function containsColor2(text,color,pointer) { for(j=0;j< text.length;j++) { if(j>=color.length)return true; if(text.charAt(j+pointer) != color.charAt(j)) return false; } return false; } function createTextLines() { //print('create lines'); lines = new MFNode(); var yPos=0; for(i =0;i< inputText.length;i++) { yPos = createWords(inputText[i].line,yPos); yPos++; //print(lines[i]); } } function createWords(paragraph,yPos) { //mfnode can only contain sfnodes so create one var line = Browser.createVrmlFromString( 'LineElement {}')[0]; if(paragraph.length==0) { lines[yPos] = line; } else { var currentLineLength=0; for(i =0;i< paragraph.length;i++) { var current = paragraph[i]; var text = current.text; //print(current.text); while(text.length > maxCharsOnALine-currentLineLength) { for(j=maxCharsOnALine-currentLineLength;j>=0;j--) { if(text.charAt(j)==' ') break; } if(j<0 && currentLineLength==0) { j=maxCharsOnALine-currentLineLength; currentLineLength=createTextLineElement(line.line,i,text.substring(0,j-1)+ '-' ,current,yPos,currentLineLength); text = text.substring(j-1,text.length); } else { currentLineLength=createTextLineElement(line.line,i,text.substring(0,j),current,yPos,currentLineLength); text = text.substring(j+1,text.length); } lines[yPos] = line; yPos++; currentLineLength=0; line = Browser.createVrmlFromString( 'LineElement {}')[0]; } currentLineLength=createTextLineElement(line.line,i,text,current,yPos,currentLineLength); //print(currentLineLength); lines[yPos] = line; //yPos++; } } //new SFNode('vrmlstring'); //print(texts[0]); return yPos; } function createTextLineElement(texts,i,text,current,yPos,currentLineLength) { var vrmlString='TextLineElement {'; var font = textFont; if(current.uri!='') font = linkFont; else if(current.email!='') font = linkFont; else if(current.webpage!='') font = linkFont; else if(current.color == 'blue') font = blueFont; else if(current.color == 'green') font = greenFont; else if(current.color == 'red') font = redFont; else if(current.color == 'bold') font = boldFont; vrmlString=vrmlString+' textFont \"' + font + '\"';; vrmlString=vrmlString+' fontSize ' + charHeight; vrmlString=vrmlString+' style \"' + current.style + '\"'; vrmlString=vrmlString+' family [\"TEXTURE 0 255 16 16 '+charAspect+' '+(charSpacing-1)+' 0\"] '; vrmlString=vrmlString+'}'; texts[i] = Browser.createVrmlFromString(vrmlString)[0]; texts[i].text=new MFString(text); texts[i].translation = new SFVec3f(-0.5+marginX+currentLineLength*charSpacing*charWidth, 0, 0.05);//changed by olaf & changed back by Tim texts[i].setYPos = 0.5-charHeight-marginY-yPos*lineSpacing*charHeight; if(current.uri!='') { texts[i].uri=current.uri; texts[i].addURLHandler = Browser.getScript(); } if(current.email!='') { texts[i].email=current.email; texts[i].addURLHandler = Browser.getScript(); } if(current.webpage!='') { texts[i].webpage=current.webpage; texts[i].addURLHandler = Browser.getScript(); } currentLineLength += text.length; return currentLineLength; } function uriClicked(value) { linkClicked = value; } function uriActive(value) { activeLink=value; } function emailClicked(value) { Browser.loadURL('javascript:sendEmail(\"'+value+'\");'); } function webpageClicked(value) { Browser.loadURL('javascript:goToWebpage(\"'+value+'\");'); } function time() { if(direction) scrollUp(); else scrollDown(); } function up(value,eventTime) { direction = true; timerStartTime=eventTime; timerEnabled =value; } function down(value,eventTime) { direction = false; timerStartTime=eventTime; timerEnabled =value; } function scrollUp() { position--; if(position<0) position=0; else { group.addChildren = lines[position].line; group.removeChildren = lines[position+pageLength].line; printText(); } resetScrollerTranslation(); } function scrollDown() { position++; if(position>lastPosition) position--; else { group.removeChildren = lines[position-1].line; group.addChildren = lines[position+pageLength-1].line; printText(); } resetScrollerTranslation(); } function scrollbarClicked(buttonDown) { if(!buttonDown) return; var newY=scrollbarSensor.hitPoint.y; if(newY<-maxScrollY) newY=-maxScrollY; if(newY> maxScrollY) newY= maxScrollY; scrollTransform.translation=new SFVec3f(0,newY,0); scrollSensor.offset=new SFVec3f(0,newY,0); } function scrollChanged(scrollTranslation) { var scrollFactor=1-(scrollTranslation.y+maxScrollY)/(2*maxScrollY); var scrollLine=Math.round(scrollFactor*(lastPosition+1)-0.5); scrollToPosition(scrollLine); } function scrollToPosition(pos) { if(pos>lastPosition) pos=lastPosition; if(pos<0) pos=0; if(pos==position) return; else { position=pos; group.children=new MFNode(); for(var i=pos;i< pos+pageLength;i++) group.addChildren=lines[i].line; printText(); } } function scrollText(value) { scrollToPosition(position+value); resetScrollerTranslation(); } function resetScrollerTranslation() { var newY=(position+0.5)/(lastPosition+1); newY += (position-lastPosition/2)/(lastPosition/2)/(2*lastPosition); newY = (1-newY)*(2*maxScrollY)-maxScrollY; if(newY>maxScrollY) newY=maxScrollY; scrollTransform.translation=new SFVec3f(0,newY,0); scrollSensor.offset=new SFVec3f(0,newY,0); } function printText() { currentLines = new MFNode(); for(i =0;i< pageLength;i++) { if(i>=lines.length) break; currentLines[i] = lines[i+position]; reposLines(currentLines[i].line,i); } //textTransform = new SFVec3f(0,position*10 ,.1); } //text.string = currentTexts; function reposLines(line,pos) { for(i=0;i< line.length;i++) { line[i].setYPos = 0.5-charHeight-marginY-pos*lineSpacing*charHeight; } }" } ROUTE UP.isActive TO S1.up ROUTE DOWN.isActive TO S1.down ROUTE scrollbarSensor.isActive TO S1.scrollbarClicked ROUTE TIMER.cycleTime TO S1.time ROUTE S1.timerStartTime TO TIMER.startTime ROUTE S1.timerEnabled TO TIMER.enabled ROUTE scrollSensor.translation_changed TO S1.scrollChanged ROUTE S1.backgroundColor TO backgroundColor.diffuseColor ROUTE S1.backgroundColor TO backgroundColor.emissiveColor } DEF scrollPane ScrollPane { # textFont "lucida.bmp" # linkFont "aerial_link_black.bmp" charAspect 0.59375 } Viewpoint { position 0 0 1.2071076 } NavigationInfo { type "WALK" } DEF script Script { field SFNode scrollPane USE scrollPane eventIn SFString linkClicked directOutput TRUE url "javascript: function initialize() { scrollPane.setText='test test'; // scrollPane.setText='[[Test bla bla]] sdfsdfkjhsd lkjhjsdlkfjsdf %blue% kjhkj'; } function linkClicked(link) { print('link clicked: '+link); // doet het niet scrollPane.loadURL=link; // doet niets }" } ROUTE scrollPane.linkClicked TO script.linkClicked