@ -1,310 +1,314 @@ |
|||||||
html, body{ |
html, body{ |
||||||
width: 100%; |
width: 100%; |
||||||
padding: 0; |
padding: 0; |
||||||
height: auto; |
height: auto; |
||||||
background-color: white; |
background-color: white; |
||||||
margin: 0; |
margin: 0; |
||||||
} |
} |
||||||
|
|
||||||
::-webkit-scrollbar { |
::-webkit-scrollbar { |
||||||
width: 14px; |
width: 14px; |
||||||
background-color:white; |
background-color:white; |
||||||
} |
} |
||||||
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb { |
::-webkit-scrollbar-thumb { |
||||||
border-radius: 10px; |
border-radius: 10px; |
||||||
background-color:lightgray; |
background-color:lightgray; |
||||||
border: 2px solid gray; |
border: 2px solid gray; |
||||||
} |
} |
||||||
|
|
||||||
::-webkit-scrollbar-button:vertical:start{ |
::-webkit-scrollbar-button:vertical:start{ |
||||||
border-radius: 10px; |
border-radius: 10px; |
||||||
background-color:lightgray; |
background-color:lightgray; |
||||||
background-image: url(../images/trgUp.png); |
background-image: url(../images/trgUp.png); |
||||||
background-size: 8px auto; |
background-size: 8px auto; |
||||||
background-position: center; |
background-position: center; |
||||||
background-repeat: no-repeat; |
background-repeat: no-repeat; |
||||||
border: 2px solid gray; |
border: 2px solid gray; |
||||||
} |
} |
||||||
|
|
||||||
::-webkit-scrollbar-button:vertical:end{ |
::-webkit-scrollbar-button:vertical:end{ |
||||||
border-radius: 10px; |
border-radius: 10px; |
||||||
background-color:lightgray; |
background-color:lightgray; |
||||||
background-image: url(../images/trgDown.png); |
background-image: url(../images/trgDown.png); |
||||||
background-size: 8px auto; |
background-size: 8px auto; |
||||||
background-position: center; |
background-position: center; |
||||||
background-repeat: no-repeat; |
background-repeat: no-repeat; |
||||||
border: 2px solid gray; |
border: 2px solid gray; |
||||||
} |
} |
||||||
|
|
||||||
a { |
a { |
||||||
text-decoration: underline; |
text-decoration: underline; |
||||||
} |
} |
||||||
|
|
||||||
#disc_nav_cont{ |
#disc_nav_cont{ |
||||||
height: auto; |
height: auto; |
||||||
position: fixed; |
position: fixed; |
||||||
left: 0; |
left: 0; |
||||||
bottom: 0; |
bottom: 0; |
||||||
width: 100%; |
width: 100%; |
||||||
} |
} |
||||||
|
|
||||||
.disclaimer{ |
.disclaimer{ |
||||||
padding: 5px; |
padding: 5px; |
||||||
text-align: center; |
text-align: center; |
||||||
background-color: #BBBBBB; |
background-color: #BBBBBB; |
||||||
border-top: solid 4px #EEEEEE; |
border-top: solid 4px #EEEEEE; |
||||||
border-bottom: none; |
border-bottom: none; |
||||||
font-size: 12px; |
font-size: 12px; |
||||||
} |
} |
||||||
|
|
||||||
.resultFooter{ |
.resultFooter{ |
||||||
width: 100%; |
width: 100%; |
||||||
padding: 3px; |
padding: 3px; |
||||||
font-family: Verdana,Arial,Helvetica,sans-serif; |
font-family: Verdana,Arial,Helvetica,sans-serif; |
||||||
font-weight: bold; |
font-weight: bold; |
||||||
font-size: x-large; |
font-size: x-large; |
||||||
text-align: center; |
text-align: center; |
||||||
background-color: white; |
background-color: white; |
||||||
} |
} |
||||||
|
|
||||||
#searchResult { |
#searchResult { |
||||||
overflow: hidden; |
overflow: hidden; |
||||||
text-align: center; |
text-align: center; |
||||||
margin-top: 50px; |
margin-top: 50px; |
||||||
margin-bottom: 50px; |
margin-bottom: 50px; |
||||||
} |
} |
||||||
|
|
||||||
.search{ |
.search{ |
||||||
position: fixed; |
position: fixed; |
||||||
top: 0; |
top: 0; |
||||||
left: 0; |
left: 0; |
||||||
padding: 5px; |
padding: 5px; |
||||||
background-color: #BBBBBB; |
background-color: #BBBBBB; |
||||||
border-bottom: solid 4px #EEEEEE; |
border-bottom: solid 4px #EEEEEE; |
||||||
} |
} |
||||||
|
|
||||||
.search, |
.search, |
||||||
.disclaimer { |
.disclaimer { |
||||||
width: 100%; |
width: 100%; |
||||||
box-sizing: border-box; |
box-sizing: border-box; |
||||||
-webkit-box-sizing: border-box; |
-webkit-box-sizing: border-box; |
||||||
} |
} |
||||||
|
|
||||||
.searchInput{ |
.searchInput{ |
||||||
padding: 3px; |
padding: 3px; |
||||||
float: left; |
float: left; |
||||||
width: 100%; |
width: 100%; |
||||||
border-radius: 3px; |
border-radius: 3px; |
||||||
border-style: none; |
border-style: none; |
||||||
height: 22px; |
height: 22px; |
||||||
line-height: 18px; |
line-height: 18px; |
||||||
vertical-align: middle; |
vertical-align: middle; |
||||||
box-sizing: border-box; |
box-sizing: border-box; |
||||||
-webkit-box-sizing: border-box; |
-webkit-box-sizing: border-box; |
||||||
} |
} |
||||||
|
|
||||||
.searchButton{ |
.searchButton{ |
||||||
background: url("../images/search_app.png") -38px -38px no-repeat; |
background: url("../images/search_app.png") -38px -38px no-repeat; |
||||||
width: 24px; |
width: 24px; |
||||||
height: 24px; |
height: 24px; |
||||||
overflow: hidden; |
overflow: hidden; |
||||||
position: absolute; |
position: absolute; |
||||||
right: 30px; |
right: 30px; |
||||||
top: 9px; |
top: 9px; |
||||||
margin-left: -2px; |
margin-left: -2px; |
||||||
cursor: pointer; |
cursor: pointer; |
||||||
} |
} |
||||||
|
|
||||||
.subSearch{ |
.subSearch{ |
||||||
margin: 0; |
margin: 0; |
||||||
float: left; |
float: left; |
||||||
} |
} |
||||||
|
|
||||||
#subSearchInput{ |
#subSearchInput{ |
||||||
width: 100%; |
width: 100%; |
||||||
float: left; |
float: left; |
||||||
box-sizing: border-box; |
box-sizing: border-box; |
||||||
-webkit-box-sizing: border-box; |
-webkit-box-sizing: border-box; |
||||||
padding: 5px; |
padding: 5px; |
||||||
padding-right: 26px; |
padding-right: 26px; |
||||||
} |
} |
||||||
|
|
||||||
#subSearchFilter{ |
#subSearchFilter{ |
||||||
width: 100%; |
width: 100%; |
||||||
float: left; |
float: left; |
||||||
display: none; |
display: none; |
||||||
} |
} |
||||||
|
|
||||||
.searchResult{ |
.searchResult{ |
||||||
width: 98%; |
width: 98%; |
||||||
padding: 3px; |
padding: 3px; |
||||||
background-color:#123456; |
background-color:#123456; |
||||||
} |
} |
||||||
|
|
||||||
.imgContainer{ |
.imgContainer{ |
||||||
display: inline-block; |
display: inline-block; |
||||||
padding: 3px; |
padding: 3px; |
||||||
margin: 3px; |
margin: 3px; |
||||||
text-align: center; |
text-align: center; |
||||||
overflow: hidden; |
overflow: hidden; |
||||||
font-size: small; |
font-size: small; |
||||||
font-family: Verdana,Arial,Helvetica,sans-serif; |
font-family: Verdana,Arial,Helvetica,sans-serif; |
||||||
vertical-align: top; |
vertical-align: top; |
||||||
} |
} |
||||||
|
|
||||||
|
.imgContainer img{ |
||||||
.filterContainer{ |
max-width: 150px; |
||||||
float: left; |
max-height:150px; |
||||||
margin: 2px; |
} |
||||||
padding: 2px; |
|
||||||
font-size: 14px; |
.filterContainer{ |
||||||
|
float: left; |
||||||
} |
margin: 2px; |
||||||
|
padding: 2px; |
||||||
.filterSelect{ |
font-size: 14px; |
||||||
border-style:none; |
|
||||||
-webkit-border-top-right-radius: 15px; |
} |
||||||
-webkit-border-bottom-right-radius: 15px; |
|
||||||
-moz-border-radius-topright: 15px; |
.filterSelect{ |
||||||
-moz-border-radius-bottomright: 15px; |
border-style:none; |
||||||
border-top-right-radius: 15px; |
-webkit-border-top-right-radius: 15px; |
||||||
margin-top: 2px; |
-webkit-border-bottom-right-radius: 15px; |
||||||
width: 100%; |
-moz-border-radius-topright: 15px; |
||||||
} |
-moz-border-radius-bottomright: 15px; |
||||||
|
border-top-right-radius: 15px; |
||||||
span{ |
margin-top: 2px; |
||||||
font-family: Verdana,Arial,Helvetica,sans-serif; |
width: 100%; |
||||||
color: #666; |
} |
||||||
} |
|
||||||
|
span{ |
||||||
[draggable] { |
font-family: Verdana,Arial,Helvetica,sans-serif; |
||||||
-webkit-user-select: none; |
color: #666; |
||||||
user-select: none; |
} |
||||||
} |
|
||||||
|
[draggable] { |
||||||
.toggleFilters{ |
-webkit-user-select: none; |
||||||
margin: 0; |
user-select: none; |
||||||
padding: 0; |
} |
||||||
background-position: center; |
|
||||||
background-image: url(../images/down.png); |
.toggleFilters{ |
||||||
position: absolute; |
margin: 0; |
||||||
top: 11px; |
padding: 0; |
||||||
right: 6px; |
background-position: center; |
||||||
width: 20px; |
background-image: url(../images/down.png); |
||||||
height: 20px; |
position: absolute; |
||||||
cursor: pointer; |
top: 11px; |
||||||
} |
right: 6px; |
||||||
|
width: 20px; |
||||||
.colors_line { |
height: 20px; |
||||||
float: left; |
cursor: pointer; |
||||||
margin: 4px; |
} |
||||||
margin-right: 0; |
|
||||||
clear: left; |
.colors_line { |
||||||
} |
float: left; |
||||||
|
margin: 4px; |
||||||
.custom { |
margin-right: 0; |
||||||
opacity: 0; |
clear: left; |
||||||
position: absolute; |
} |
||||||
left: -10000px; |
|
||||||
} |
.custom { |
||||||
|
opacity: 0; |
||||||
.filter_button.button.color { |
position: absolute; |
||||||
display: inline-block; |
left: -10000px; |
||||||
width: 15px; |
} |
||||||
height: 15px; |
|
||||||
border: 1px solid #EBEBEB; |
.filter_button.button.color { |
||||||
padding: 0; |
display: inline-block; |
||||||
margin: 0; |
width: 15px; |
||||||
box-sizing: border-box; |
height: 15px; |
||||||
-webkit-box-sizing: border-box; |
border: 1px solid #EBEBEB; |
||||||
} |
padding: 0; |
||||||
|
margin: 0; |
||||||
.filter_button.button.color:hover { |
box-sizing: border-box; |
||||||
border: 1px solid rgb(128,128,128); |
-webkit-box-sizing: border-box; |
||||||
cursor: pointer; |
} |
||||||
} |
|
||||||
|
.filter_button.button.color:hover { |
||||||
input[type="radio"]:checked + .filter_button.button.color { |
border: 1px solid rgb(128,128,128); |
||||||
border: 1px solid rgb(255,255,255); |
cursor: pointer; |
||||||
box-shadow: 0 0 0px 1px #000; |
} |
||||||
-webkit-box-shadow: 0 0 0px 1px #000; |
|
||||||
} |
input[type="radio"]:checked + .filter_button.button.color { |
||||||
|
border: 1px solid rgb(255,255,255); |
||||||
#allcolor { |
box-shadow: 0 0 0px 1px #000; |
||||||
background: white url('../images/search_app.png') -43px -144px no-repeat; |
-webkit-box-shadow: 0 0 0px 1px #000; |
||||||
} |
} |
||||||
|
|
||||||
#colored { |
#allcolor { |
||||||
background: white url('../images/search_app.png') -43px -244px no-repeat; |
background: white url('../images/search_app.png') -43px -144px no-repeat; |
||||||
} |
} |
||||||
|
|
||||||
#grayed { |
#colored { |
||||||
background: white url('../images/search_app.png') -45px -343px no-repeat; |
background: white url('../images/search_app.png') -43px -244px no-repeat; |
||||||
} |
} |
||||||
|
|
||||||
#black{ |
#grayed { |
||||||
background-color:#ffffff; |
background: white url('../images/search_app.png') -45px -343px no-repeat; |
||||||
} |
} |
||||||
#blue{ |
|
||||||
background-color:#0000FF; |
#black{ |
||||||
} |
background-color:#ffffff; |
||||||
#brown{ |
} |
||||||
background-color:rgba(139, 82, 16, 1); |
#blue{ |
||||||
} |
background-color:#0000FF; |
||||||
|
} |
||||||
#gray{ |
#brown{ |
||||||
background-color:#999999; |
background-color:rgba(139, 82, 16, 1); |
||||||
} |
} |
||||||
|
|
||||||
#green{ |
#gray{ |
||||||
background-color:#00CC00; |
background-color:#999999; |
||||||
} |
} |
||||||
|
|
||||||
#orange{ |
#green{ |
||||||
background-color:#FB940B; |
background-color:#00CC00; |
||||||
} |
} |
||||||
|
|
||||||
#pink{ |
#orange{ |
||||||
background-color:#FF98BF; |
background-color:#FB940B; |
||||||
} |
} |
||||||
|
|
||||||
#purple{ |
#pink{ |
||||||
background-color:#762CA7; |
background-color:#FF98BF; |
||||||
} |
} |
||||||
|
|
||||||
#red{ |
#purple{ |
||||||
background-color:#CC0000; |
background-color:#762CA7; |
||||||
} |
} |
||||||
|
|
||||||
#teal{ |
#red{ |
||||||
background-color:#03C0C6; |
background-color:#CC0000; |
||||||
} |
} |
||||||
|
|
||||||
#white{ |
#teal{ |
||||||
background-color:#000000; |
background-color:#03C0C6; |
||||||
} |
} |
||||||
|
|
||||||
#yellow{ |
#white{ |
||||||
background-color:#FFFF00; |
background-color:#000000; |
||||||
} |
} |
||||||
|
|
||||||
.selectBox-dropdown, .selectBox-options li a { |
#yellow{ |
||||||
line-height: 1.3 !important; |
background-color:#FFFF00; |
||||||
font-size: 13px; |
} |
||||||
} |
|
||||||
|
.selectBox-dropdown, .selectBox-options li a { |
||||||
.pager_button { |
line-height: 1.3 !important; |
||||||
padding: 3px 5px; |
font-size: 13px; |
||||||
font-size: 16px; |
} |
||||||
color: black; |
|
||||||
display: inline-block; |
.pager_button { |
||||||
} |
padding: 3px 5px; |
||||||
|
font-size: 16px; |
||||||
.pager_button.active { |
color: black; |
||||||
border-radius: 3px; |
display: inline-block; |
||||||
-webkit-border-radius: 3px; |
} |
||||||
background-color: gray; |
|
||||||
color: white; |
.pager_button.active { |
||||||
} |
border-radius: 3px; |
||||||
|
-webkit-border-radius: 3px; |
||||||
|
background-color: gray; |
||||||
|
color: white; |
||||||
|
} |
||||||
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 214 B After Width: | Height: | Size: 214 B |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 931 B After Width: | Height: | Size: 931 B |
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 475 B After Width: | Height: | Size: 475 B |
Before Width: | Height: | Size: 448 B After Width: | Height: | Size: 448 B |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
@ -1,264 +1,264 @@ |
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> |
||||||
<html xmlns="http://www.w3.org/1999/xhtml"> |
<html xmlns="http://www.w3.org/1999/xhtml"> |
||||||
<head> |
<head> |
||||||
<title>Planete Sankore Image Search</title> |
<title>Planete Sankore Image Search</title> |
||||||
<link rel="stylesheet" type="text/css" href="css/basic.css"/> |
<link rel="stylesheet" type="text/css" href="css/basic.css"/> |
||||||
<script type="text/javascript" src="scripts/jquery-1.6.2.min.js"></script> |
<script type="text/javascript" src="scripts/jquery-1.6.2.min.js"></script> |
||||||
<script type="text/javascript"> |
<script type="text/javascript"> |
||||||
var category = "image"; |
var category = "image"; |
||||||
var thumbnails = true; |
var thumbnails = true; |
||||||
var minHeight = 180; |
var minHeight = 150; |
||||||
var minWidth = 150; |
var minWidth = 150; |
||||||
|
|
||||||
var currentIndex = 0; |
var currentIndex = 0; |
||||||
var currentTerm = ""; |
var currentTerm = ""; |
||||||
var limit = 10; |
var limit = 10; |
||||||
var filtersDisplayed = false; //display or hide filters |
var filtersDisplayed = false; //display or hide filters |
||||||
|
|
||||||
function addPaginationLinks(totalResults) { |
function addPaginationLinks(totalResults) { |
||||||
var curPage = currentIndex; // check what page the app is on |
var curPage = currentIndex; // check what page the app is on |
||||||
var pagesDiv = $("<div id='resultFooter' class='resultFooter'>"); |
var pagesDiv = $("<div id='resultFooter' class='resultFooter'>"); |
||||||
for (var i = 0; i < 8; i++) { |
for (var i = 0; i < 8; i++) { |
||||||
if (i * limit < totalResults) { |
if (i * limit < totalResults) { |
||||||
|
|
||||||
var link = $("<a class='pager_button'></a>").attr('href', 'javascript:gotoPage('+i+');').html(i+1).appendTo(pagesDiv); |
var link = $("<a class='pager_button'></a>").attr('href', 'javascript:gotoPage('+i+');').html(i+1).appendTo(pagesDiv); |
||||||
if (curPage == i) { |
if (curPage == i) { |
||||||
link.addClass('active'); |
link.addClass('active'); |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
$("#disc_nav_cont #resultFooter").remove(); |
$("#disc_nav_cont #resultFooter").remove(); |
||||||
pagesDiv.insertBefore($('#disclaimer')); |
pagesDiv.insertBefore($('#disclaimer')); |
||||||
|
|
||||||
$(".imgContainer").each(function(){ |
$(".imgContainer").each(function(){ |
||||||
this.addEventListener("dragstart", imageDragging, false); |
this.addEventListener("dragstart", imageDragging, false); |
||||||
}) |
}) |
||||||
|
|
||||||
$(".imgContainer").each(function(){ |
$(".imgContainer").each(function(){ |
||||||
this.addEventListener("dragenter", imageDragenter, false); |
this.addEventListener("dragenter", imageDragenter, false); |
||||||
}) |
}) |
||||||
|
|
||||||
$(".imgContainer").each(function(){ |
$(".imgContainer").each(function(){ |
||||||
this.addEventListener("dragleave", imageDragleave, false); |
this.addEventListener("dragleave", imageDragleave, false); |
||||||
}) |
}) |
||||||
|
|
||||||
$(".imgContainer").each(function(){ |
$(".imgContainer").each(function(){ |
||||||
this.addEventListener("dragover", imageDragover, false); |
this.addEventListener("dragover", imageDragover, false); |
||||||
}) |
}) |
||||||
} |
} |
||||||
|
|
||||||
function searchFail(jqXHR, textStatus, errorThrown) { |
function searchFail(jqXHR, textStatus, errorThrown) { |
||||||
alert('Impossible to connect to Planete Sankore: ' + textStatus + ' ' + errorThrown); |
alert('Impossible to connect to Planete Sankore: ' + textStatus + ' ' + errorThrown); |
||||||
} |
} |
||||||
|
|
||||||
function searchComplete(json) { |
function searchComplete(json) { |
||||||
// Grab our content div, clear it. |
// Grab our content div, clear it. |
||||||
var totalResults = json.totalResults; |
var totalResults = json.totalResults; |
||||||
var contentDiv = $('#searchResult').empty(); |
var contentDiv = $('#searchResult').empty(); |
||||||
// Loop through our results, printing them to the page. |
// Loop through our results, printing them to the page. |
||||||
var results = json.rows; |
var results = json.rows; |
||||||
for (var i = 0; i < results.length; i++) { |
for (var i = 0; i < results.length; i++) { |
||||||
// For each result write it's title and image to the screen |
// For each result write it's title and image to the screen |
||||||
var result = results[i]; |
var result = results[i]; |
||||||
var imgContainer = $("<div class='imgContainer' draggable='true'>"); |
var imgContainer = $("<div class='imgContainer' draggable='true'>"); |
||||||
//var title = document.createElement('div'); |
//var title = document.createElement('div'); |
||||||
var iUrl = $("<input type='hidden'/>"); |
var iUrl = $("<input type='hidden'/>"); |
||||||
var iContent = $("<input type='hidden'/>"); |
var iContent = $("<input type='hidden'/>"); |
||||||
var iHeight = $("<input type='hidden'/>"); |
var iHeight = $("<input type='hidden'/>"); |
||||||
var iWidth = $("<input type='hidden'/>"); |
var iWidth = $("<input type='hidden'/>"); |
||||||
var iTitle = $("<input type='hidden'/>"); |
var iTitle = $("<input type='hidden'/>"); |
||||||
|
|
||||||
// We use titleNoFormatting so that no HTML tags are left in the |
// We use titleNoFormatting so that no HTML tags are left in the |
||||||
// title |
// title |
||||||
//title.innerHTML = result.title; |
//title.innerHTML = result.title; |
||||||
var newImg = document.createElement('img'); |
var newImg = document.createElement('img'); |
||||||
|
|
||||||
// There is also a result.file property which has the escaped version |
// There is also a result.file property which has the escaped version |
||||||
if (thumbnails) { |
if (thumbnails) { |
||||||
newImg.src = result.file; |
newImg.src = result.file; |
||||||
if(result.height >= result.width) |
/*if(result.height >= result.width) |
||||||
newImg.height = minHeight; |
newImg.height = minHeight; |
||||||
else{ |
else{ |
||||||
newImg.width = minWidth; |
newImg.width = minWidth; |
||||||
//newImg.style.margin = (120 - result.height)/2 + "px 0"; |
//newImg.style.margin = (120 - result.height)/2 + "px 0"; |
||||||
} |
}*/ |
||||||
} else { |
} else { |
||||||
newImg.src = "./images/thumbnail_icon.png"; |
newImg.src = "./images/thumbnail_icon.png"; |
||||||
} |
} |
||||||
var imgWidth = (result.tbWidth > minWidth)?result.tbWidth:minWidth; |
var imgWidth = (result.tbWidth > minWidth)?result.tbWidth:minWidth; |
||||||
var imgHeight = (result.tbHeight > minHeight)?result.tbHeight:minHeight; |
var imgHeight = (result.tbHeight > minHeight)?result.tbHeight:minHeight; |
||||||
imgContainer.width(imgWidth).height(imgHeight); |
imgContainer.width(imgWidth).height(imgHeight); |
||||||
imgContainer.append($(newImg)); |
imgContainer.append($(newImg)); |
||||||
iUrl.attr("value", result.file); |
iUrl.attr("value", result.file); |
||||||
iContent.attr("value", result.title); |
iContent.attr("value", result.title); |
||||||
iHeight.attr("value", result.height); |
iHeight.attr("value", result.height); |
||||||
iWidth.attr("value", result.width); |
iWidth.attr("value", result.width); |
||||||
iTitle.attr("value",result.title); |
iTitle.attr("value",result.title); |
||||||
//imgContainer.append($(title)); |
//imgContainer.append($(title)); |
||||||
imgContainer.append(iUrl); |
imgContainer.append(iUrl); |
||||||
imgContainer.append(iContent); |
imgContainer.append(iContent); |
||||||
imgContainer.append(iHeight); |
imgContainer.append(iHeight); |
||||||
imgContainer.append(iWidth); |
imgContainer.append(iWidth); |
||||||
imgContainer.append(iTitle); |
imgContainer.append(iTitle); |
||||||
|
|
||||||
// Put our title + image in the content |
// Put our title + image in the content |
||||||
imgContainer.appendTo(contentDiv); |
imgContainer.appendTo(contentDiv); |
||||||
|
|
||||||
} |
} |
||||||
// Now add links to additional pages of search results. |
// Now add links to additional pages of search results. |
||||||
addPaginationLinks(totalResults); |
addPaginationLinks(totalResults); |
||||||
} |
} |
||||||
|
|
||||||
function imageDragging(e){ |
function imageDragging(e){ |
||||||
e.dataTransfer.setData("text/plain",$(this).find("input:hidden").eq(0).val()); |
e.dataTransfer.setData("text/plain",$(this).find("input:hidden").eq(0).val()); |
||||||
// alert($(this).find("input:hidden").eq(0).val()); |
// alert($(this).find("input:hidden").eq(0).val()); |
||||||
} |
} |
||||||
|
|
||||||
function imageDragleave(e){ |
function imageDragleave(e){ |
||||||
return false; |
return false; |
||||||
} |
} |
||||||
|
|
||||||
function imageDragover(e){ |
function imageDragover(e){ |
||||||
return false; |
return false; |
||||||
} |
} |
||||||
|
|
||||||
function imageDragenter(e){ |
function imageDragenter(e){ |
||||||
return false; |
return false; |
||||||
} |
} |
||||||
|
|
||||||
$(document).ready(function(){ |
$(document).ready(function(){ |
||||||
|
|
||||||
//variables |
//variables |
||||||
var mode = false; //search or view mode |
var mode = false; //search or view mode |
||||||
var hide = false; //hide or no main panel |
var hide = false; //hide or no main panel |
||||||
|
|
||||||
//basic containers and elements |
//basic containers and elements |
||||||
|
|
||||||
var disc_nav_cont = $("<div id='disc_nav_cont' class='disc_nav_cont'>").appendTo("body"); |
var disc_nav_cont = $("<div id='disc_nav_cont' class='disc_nav_cont'>").appendTo("body"); |
||||||
var disclaimer = $("<div id='disclaimer' class='disclaimer'>Recherche d'images sur Planète Sankoré<div>").appendTo(disc_nav_cont); |
var disclaimer = $("<div id='disclaimer' class='disclaimer'>Recherche d'images sur Planète Sankoré<div>").appendTo(disc_nav_cont); |
||||||
var search = $("<div id='search' class='search'>").appendTo("body"); |
var search = $("<div id='search' class='search'>").appendTo("body"); |
||||||
|
|
||||||
var togglePages = $("<div id='togglePages' class='togglePages'>").appendTo(search); |
var togglePages = $("<div id='togglePages' class='togglePages'>").appendTo(search); |
||||||
var toggleIcon = $("<div id='toggleIcon' class='toggleIcon'>").appendTo(togglePages); |
var toggleIcon = $("<div id='toggleIcon' class='toggleIcon'>").appendTo(togglePages); |
||||||
|
|
||||||
var subSearchInput = $("<div id='subSearchInput' class='subSearch'>").appendTo(search); |
var subSearchInput = $("<div id='subSearchInput' class='subSearch'>").appendTo(search); |
||||||
var subSearchFilter = $("<div id='subSearchFilter' class='subSearch'>").appendTo(search); |
var subSearchFilter = $("<div id='subSearchFilter' class='subSearch'>").appendTo(search); |
||||||
|
|
||||||
var searchInput = $("<input id='searchInput' class='searchInput' type='text'/>").appendTo(subSearchInput); |
var searchInput = $("<input id='searchInput' class='searchInput' type='text'/>").appendTo(subSearchInput); |
||||||
var searchButton = $("<div id='searchButton' class='searchButton'>").appendTo(subSearchInput); |
var searchButton = $("<div id='searchButton' class='searchButton'>").appendTo(subSearchInput); |
||||||
// var toggleFilters = $("<div id='toggleFilters' class='toggleFilters'>").appendTo(subSearchInput); |
// var toggleFilters = $("<div id='toggleFilters' class='toggleFilters'>").appendTo(subSearchInput); |
||||||
|
|
||||||
//adding filters to the wgt |
//adding filters to the wgt |
||||||
var selectFilter = $("<select id='sizeFilter' class='filterSelect'>") |
var selectFilter = $("<select id='sizeFilter' class='filterSelect'>") |
||||||
.append($("<option value='0'>Any</option>")) |
.append($("<option value='0'>Any</option>")) |
||||||
.append($("<option value='1'>Small</option>")) |
.append($("<option value='1'>Small</option>")) |
||||||
.append($("<option value='2'>Medium</option>")) |
.append($("<option value='2'>Medium</option>")) |
||||||
.append($("<option value='3'>Large</option>")) |
.append($("<option value='3'>Large</option>")) |
||||||
.append($("<option value='4'>Extra large</option>")); |
.append($("<option value='4'>Extra large</option>")); |
||||||
$("<div class='filterContainer'>").append("<span>Size:</span>").append(selectFilter).appendTo(subSearchFilter); |
$("<div class='filterContainer'>").append("<span>Size:</span>").append(selectFilter).appendTo(subSearchFilter); |
||||||
|
|
||||||
//mouse click actions |
//mouse click actions |
||||||
/* |
/* |
||||||
toggleFilters.click(function(){ |
toggleFilters.click(function(){ |
||||||
if(filtersDisplayed){ |
if(filtersDisplayed){ |
||||||
subSearchFilter.hide(); |
subSearchFilter.hide(); |
||||||
toggleFilters.css("background-image","url(images/down.png)"); |
toggleFilters.css("background-image","url(images/down.png)"); |
||||||
filtersDisplayed = false; |
filtersDisplayed = false; |
||||||
} else { |
} else { |
||||||
subSearchFilter.show(); |
subSearchFilter.show(); |
||||||
toggleFilters.css("background-image","url(images/up.png)"); |
toggleFilters.css("background-image","url(images/up.png)"); |
||||||
filtersDisplayed = true; |
filtersDisplayed = true; |
||||||
} |
} |
||||||
}); |
}); |
||||||
*/ |
*/ |
||||||
|
|
||||||
/*togglePages.click(function(event){ |
/*togglePages.click(function(event){ |
||||||
if(mode){ |
if(mode){ |
||||||
hide = false; |
hide = false; |
||||||
$("#search, #disclaimer").slideDown('slow', function(){ |
$("#search, #disclaimer").slideDown('slow', function(){ |
||||||
toggleIcon.css("background-image","url(images/trgUp.png)"); |
toggleIcon.css("background-image","url(images/trgUp.png)"); |
||||||
togglePages.appendTo("#search").css("top","").css("bottom","-14px"); |
togglePages.appendTo("#search").css("top","").css("bottom","-14px"); |
||||||
}); |
}); |
||||||
mode = false; |
mode = false; |
||||||
} else { |
} else { |
||||||
hide = true; |
hide = true; |
||||||
$("#search, #disclaimer").slideUp('slow', function(){ |
$("#search, #disclaimer").slideUp('slow', function(){ |
||||||
toggleIcon.css("background-image","url(images/trgDown.png)"); |
toggleIcon.css("background-image","url(images/trgDown.png)"); |
||||||
togglePages.appendTo("body").css("top","0"); |
togglePages.appendTo("body").css("top","0"); |
||||||
}); |
}); |
||||||
mode = true; |
mode = true; |
||||||
} |
} |
||||||
});*/ |
});*/ |
||||||
|
|
||||||
searchButton.click(function(){ |
searchButton.click(function(){ |
||||||
if(!hide){ |
if(!hide){ |
||||||
runSearch(searchInput.val(), 0); |
runSearch(searchInput.val(), 0); |
||||||
//togglePages.trigger("click"); |
//togglePages.trigger("click"); |
||||||
} |
} |
||||||
}); |
}); |
||||||
|
|
||||||
searchInput.keydown(function(event){ |
searchInput.keydown(function(event){ |
||||||
if(!hide){ |
if(!hide){ |
||||||
if((event.keyCode == 0xA)||(event.keyCode == 0xD)){ |
if((event.keyCode == 0xA)||(event.keyCode == 0xD)){ |
||||||
runSearch(searchInput.val(), 0); |
runSearch(searchInput.val(), 0); |
||||||
//togglePages.trigger("click"); |
//togglePages.trigger("click"); |
||||||
} |
} |
||||||
|
|
||||||
} |
} |
||||||
}); |
}); |
||||||
( |
( |
||||||
$(".imgContainer").live("click",function(){ |
$(".imgContainer").live("click",function(){ |
||||||
sankore.sendFileMetadata(createMetaData($(this))); |
sankore.sendFileMetadata(createMetaData($(this))); |
||||||
})); |
})); |
||||||
|
|
||||||
/*$(window).resize(function(){ |
/*$(window).resize(function(){ |
||||||
disclaimer.width($("body").width()-20); |
disclaimer.width($("body").width()-20); |
||||||
search.width($("body").width()-20); |
search.width($("body").width()-20); |
||||||
toggleIcon.css("margin-left",(togglePages.width()/2 - 7)); |
toggleIcon.css("margin-left",(togglePages.width()/2 - 7)); |
||||||
})*/ |
})*/ |
||||||
|
|
||||||
}); |
}); |
||||||
|
|
||||||
function gotoPage(i) { |
function gotoPage(i) { |
||||||
runSearch(currentTerm, i); |
runSearch(currentTerm, i); |
||||||
} |
} |
||||||
|
|
||||||
// launching the search on planete sankore |
// launching the search on planete sankore |
||||||
function runSearch(term, index) { |
function runSearch(term, index) { |
||||||
currentTerm = term; |
currentTerm = term; |
||||||
currentIndex = index; |
currentIndex = index; |
||||||
var start = index * limit; |
var start = index * limit; |
||||||
var url = "http://planete.sankore.org/xwiki/bin/view/Search/Resources?xpage=plain&category=" + category + "&level=&sort=title&dir=ASC&terms=" + escape(term) + "&start=" + start + "&limit=" + limit; |
var url = "http://planete.sankore.org/xwiki/bin/view/Search/Resources?xpage=plain&category=" + category + "&level=&sort=title&dir=ASC&terms=" + escape(term) + "&start=" + start + "&limit=" + limit; |
||||||
$.ajax({ |
$.ajax({ |
||||||
url: url, |
url: url, |
||||||
success: searchComplete, |
success: searchComplete, |
||||||
error: searchFail, |
error: searchFail, |
||||||
dataType: "json" |
dataType: "json" |
||||||
}); |
}); |
||||||
} |
} |
||||||
|
|
||||||
function createMetaData(parent){ |
function createMetaData(parent){ |
||||||
var meta = ""; |
var meta = ""; |
||||||
//alert($(this).find("input:hidden").eq(0).val()); |
//alert($(this).find("input:hidden").eq(0).val()); |
||||||
meta = "<metadata><data><key>Type</key><value>Image</value></data><data><key>Url</key><value>" + |
meta = "<metadata><data><key>Type</key><value>Image</value></data><data><key>Url</key><value>" + |
||||||
parent.find("input:hidden").eq(0).val() + |
parent.find("input:hidden").eq(0).val() + |
||||||
"</value></data><data><key>Content</key><value>" + |
"</value></data><data><key>Content</key><value>" + |
||||||
parent.find("input:hidden").eq(1).val() + |
parent.find("input:hidden").eq(1).val() + |
||||||
"</value></data><data><key>Height</key><value>" + |
"</value></data><data><key>Height</key><value>" + |
||||||
parent.find("input:hidden").eq(2).val() + |
parent.find("input:hidden").eq(2).val() + |
||||||
"</value></data><data><key>Width</key><value>" + |
"</value></data><data><key>Width</key><value>" + |
||||||
parent.find("input:hidden").eq(3).val() + |
parent.find("input:hidden").eq(3).val() + |
||||||
"</value></data><data><key>Title</key><value>" + |
"</value></data><data><key>Title</key><value>" + |
||||||
parent.find("input:hidden").eq(4).val() + |
parent.find("input:hidden").eq(4).val() + |
||||||
"</value></data></metadata>"; |
"</value></data></metadata>"; |
||||||
return meta; |
return meta; |
||||||
} |
} |
||||||
</script> |
</script> |
||||||
|
|
||||||
</head> |
</head> |
||||||
<body style="font-family: Arial;border: 0 none;"> |
<body style="font-family: Arial;border: 0 none;"> |
||||||
<div id="searchResult"></div> |
<div id="searchResult"></div> |
||||||
</body> |
</body> |
||||||
</html> |
</html> |
||||||
|
@ -1,476 +0,0 @@ |
|||||||
/*
|
|
||||||
* 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/ |
|
||||||
|
|
||||||
#include "UBAbstractWidget.h" |
|
||||||
|
|
||||||
#include <QtNetwork> |
|
||||||
#include <QtXml> |
|
||||||
|
|
||||||
#include "frameworks/UBFileSystemUtils.h" |
|
||||||
|
|
||||||
#include "core/UBApplicationController.h" |
|
||||||
#include "core/UBApplication.h" |
|
||||||
#include "core/UBSettings.h" |
|
||||||
|
|
||||||
#include "network/UBNetworkAccessManager.h" |
|
||||||
|
|
||||||
#include "web/UBWebPage.h" |
|
||||||
#include "web/UBWebKitUtils.h" |
|
||||||
#include "web/UBWebController.h" |
|
||||||
|
|
||||||
#include "core/memcheck.h" |
|
||||||
|
|
||||||
QStringList UBAbstractWidget::sInlineJavaScripts; |
|
||||||
bool UBAbstractWidget::sInlineJavaScriptLoaded = false; |
|
||||||
|
|
||||||
UBAbstractWidget::UBAbstractWidget(const QUrl& pWidgetUrl, QWidget *parent) |
|
||||||
: UBRoutedMouseEventWebView(parent) |
|
||||||
, mWidgetUrl(pWidgetUrl) |
|
||||||
, mIsResizable(false) |
|
||||||
, mInitialLoadDone(false) |
|
||||||
, mLoadIsErronous(false) |
|
||||||
, mIsFreezable(true) |
|
||||||
, mCanBeContent(0) |
|
||||||
, mCanBeTool(0) |
|
||||||
, mIsFrozen(false) |
|
||||||
, mIsTakingSnapshot(false) |
|
||||||
{ |
|
||||||
setAcceptDrops(true); |
|
||||||
setPage(new UBWebPage(this)); |
|
||||||
QWebView::settings()->setAttribute(QWebSettings::JavaEnabled, true); |
|
||||||
QWebView::settings()->setAttribute(QWebSettings::PluginsEnabled, true); |
|
||||||
QWebView::settings()->setAttribute(QWebSettings::LocalStorageDatabaseEnabled, true); |
|
||||||
QWebView::settings()->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, true); |
|
||||||
QWebView::settings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true); |
|
||||||
QWebView::settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard, true); |
|
||||||
QWebView::settings()->setAttribute(QWebSettings::DnsPrefetchEnabled, true); |
|
||||||
|
|
||||||
QWebView::page()->setNetworkAccessManager(UBNetworkAccessManager::defaultAccessManager()); |
|
||||||
|
|
||||||
setAutoFillBackground(false); |
|
||||||
|
|
||||||
QPalette pagePalette = QWebView::page()->palette(); |
|
||||||
pagePalette.setBrush(QPalette::Base, QBrush(Qt::transparent)); |
|
||||||
pagePalette.setBrush(QPalette::Window, QBrush(Qt::transparent)); |
|
||||||
QWebView::page()->setPalette(pagePalette); |
|
||||||
|
|
||||||
QPalette viewPalette = palette(); |
|
||||||
pagePalette.setBrush(QPalette::Base, QBrush(Qt::transparent)); |
|
||||||
viewPalette.setBrush(QPalette::Window, QBrush(Qt::transparent)); |
|
||||||
setPalette(viewPalette); |
|
||||||
|
|
||||||
connect(QWebView::page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(javaScriptWindowObjectCleared())); |
|
||||||
connect(QWebView::page(), SIGNAL(geometryChangeRequested(const QRect&)), this, SIGNAL(geometryChangeRequested(const QRect&))); |
|
||||||
connect(this, SIGNAL(loadFinished(bool)), this, SLOT(mainFrameLoadFinished (bool))); |
|
||||||
|
|
||||||
setMouseTracking(true); |
|
||||||
} |
|
||||||
|
|
||||||
bool UBAbstractWidget::canBeContent() |
|
||||||
{ |
|
||||||
// if we under MAC OS
|
|
||||||
#if defined(Q_OS_MAC) |
|
||||||
return mCanBeContent & UBAbstractWidget::type_MAC; |
|
||||||
#endif |
|
||||||
|
|
||||||
// if we under UNIX OS
|
|
||||||
#if defined(Q_OS_UNIX) |
|
||||||
return mCanBeContent & UBAbstractWidget::type_UNIX; |
|
||||||
#endif |
|
||||||
|
|
||||||
// if we under WINDOWS OS
|
|
||||||
#if defined(Q_OS_WIN) |
|
||||||
return mCanBeContent & UBAbstractWidget::type_WIN; |
|
||||||
#endif |
|
||||||
} |
|
||||||
|
|
||||||
bool UBAbstractWidget::canBeTool() |
|
||||||
{ |
|
||||||
// if we under MAC OS
|
|
||||||
#if defined(Q_OS_MAC) |
|
||||||
return mCanBeTool & UBAbstractWidget::type_MAC; |
|
||||||
#endif |
|
||||||
|
|
||||||
// if we under UNIX OS
|
|
||||||
#if defined(Q_OS_UNIX) |
|
||||||
return mCanBeTool & UBAbstractWidget::type_UNIX; |
|
||||||
#endif |
|
||||||
|
|
||||||
// if we under WINDOWS OS
|
|
||||||
#if defined(Q_OS_WIN) |
|
||||||
return mCanBeTool & UBAbstractWidget::type_WIN; |
|
||||||
#endif |
|
||||||
} |
|
||||||
|
|
||||||
UBAbstractWidget::~UBAbstractWidget() |
|
||||||
{ |
|
||||||
// NOOP
|
|
||||||
} |
|
||||||
|
|
||||||
void UBAbstractWidget::loadMainHtml() |
|
||||||
{ |
|
||||||
mInitialLoadDone = false; |
|
||||||
QWebView::load(mMainHtmlUrl); |
|
||||||
} |
|
||||||
|
|
||||||
bool UBAbstractWidget::event(QEvent *event) |
|
||||||
{ |
|
||||||
if (event->type() == QEvent::ContextMenu) |
|
||||||
{ |
|
||||||
event->accept(); |
|
||||||
return true; |
|
||||||
} else { |
|
||||||
return QWebView::event(event); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void UBAbstractWidget::mainFrameLoadFinished (bool ok) |
|
||||||
{ |
|
||||||
mInitialLoadDone = true; |
|
||||||
mLoadIsErronous = !ok; |
|
||||||
|
|
||||||
update(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
bool UBAbstractWidget::hasEmbededObjects() |
|
||||||
{ |
|
||||||
if (QWebView::page()->mainFrame()) |
|
||||||
{ |
|
||||||
QList<UBWebKitUtils::HtmlObject> htmlObjects = UBWebKitUtils::objectsInFrame(QWebView::page()->mainFrame()); |
|
||||||
return htmlObjects.length() > 0; |
|
||||||
} |
|
||||||
|
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
bool UBAbstractWidget::hasEmbededFlash() |
|
||||||
{ |
|
||||||
if (hasEmbededObjects()) |
|
||||||
{ |
|
||||||
return QWebView::page()->mainFrame()->toHtml().contains("application/x-shockwave-flash"); |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
return false; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void UBAbstractWidget::resize(qreal width, qreal height) |
|
||||||
{ |
|
||||||
qreal w = qMax((qreal)mNominalSize.width(), width); |
|
||||||
qreal h = qMax((qreal)mNominalSize.height(), height); |
|
||||||
QWebView::page()->setViewportSize(QSize(w, h)); |
|
||||||
QWebView::setFixedSize(QSize(w, h)); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
QString UBAbstractWidget::iconFilePath(const QUrl& pUrl) |
|
||||||
{ |
|
||||||
// TODO UB 4.x read config.xml widget.icon param first
|
|
||||||
|
|
||||||
QStringList files; |
|
||||||
|
|
||||||
files << "icon.svg"; // W3C widget default 1
|
|
||||||
files << "icon.ico"; // W3C widget default 2
|
|
||||||
files << "icon.png"; // W3C widget default 3
|
|
||||||
files << "icon.gif"; // W3C widget default 4
|
|
||||||
|
|
||||||
files << "Icon.png"; // Apple widget default
|
|
||||||
|
|
||||||
QString file = UBFileSystemUtils::getFirstExistingFileFromList(pUrl.toLocalFile(), files); |
|
||||||
|
|
||||||
// default
|
|
||||||
if (file.length() == 0) |
|
||||||
{ |
|
||||||
file = QString(":/images/defaultWidgetIcon.png"); |
|
||||||
} |
|
||||||
|
|
||||||
return file; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
QString UBAbstractWidget::widgetName(const QUrl& widgetPath) |
|
||||||
{ |
|
||||||
QString name; |
|
||||||
QString version; |
|
||||||
|
|
||||||
QFile w3CConfigFile(widgetPath.toLocalFile() + "/config.xml"); |
|
||||||
QFile appleConfigFile(widgetPath.toLocalFile() + "/Info.plist"); |
|
||||||
|
|
||||||
if (w3CConfigFile.exists() && w3CConfigFile.open(QFile::ReadOnly)) |
|
||||||
{ |
|
||||||
QDomDocument doc; |
|
||||||
doc.setContent(w3CConfigFile.readAll()); |
|
||||||
QDomElement root = doc.firstChildElement("widget"); |
|
||||||
if (!root.isNull()) |
|
||||||
{ |
|
||||||
QDomElement nameElement = root.firstChildElement("name"); |
|
||||||
if (!nameElement.isNull()) |
|
||||||
name = nameElement.text(); |
|
||||||
|
|
||||||
version = root.attribute("version", ""); |
|
||||||
} |
|
||||||
|
|
||||||
w3CConfigFile.close(); |
|
||||||
} |
|
||||||
else if (appleConfigFile.exists() && appleConfigFile.open(QFile::ReadOnly)) |
|
||||||
{ |
|
||||||
QDomDocument doc; |
|
||||||
doc.setContent(appleConfigFile.readAll()); |
|
||||||
QDomElement root = doc.firstChildElement("plist"); |
|
||||||
if (!root.isNull()) |
|
||||||
{ |
|
||||||
QDomElement dictElement = root.firstChildElement("dict"); |
|
||||||
if (!dictElement.isNull()) |
|
||||||
{ |
|
||||||
QDomNodeList childNodes = dictElement.childNodes(); |
|
||||||
|
|
||||||
// looking for something like
|
|
||||||
// ..
|
|
||||||
// <key>CFBundleDisplayName</key>
|
|
||||||
// <string>brain scans</string>
|
|
||||||
// ..
|
|
||||||
|
|
||||||
for(int i = 0; i < childNodes.count() - 1; i++) |
|
||||||
{ |
|
||||||
if (childNodes.at(i).isElement()) |
|
||||||
{ |
|
||||||
QDomElement elKey = childNodes.at(i).toElement(); |
|
||||||
if (elKey.text() == "CFBundleDisplayName") |
|
||||||
{ |
|
||||||
if (childNodes.at(i + 1).isElement()) |
|
||||||
{ |
|
||||||
QDomElement elValue = childNodes.at(i + 1).toElement(); |
|
||||||
name = elValue.text(); |
|
||||||
} |
|
||||||
} |
|
||||||
else if (elKey.text() == "CFBundleShortVersionString") |
|
||||||
{ |
|
||||||
if (childNodes.at(i + 1).isElement()) |
|
||||||
{ |
|
||||||
QDomElement elValue = childNodes.at(i + 1).toElement(); |
|
||||||
version = elValue.text(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
appleConfigFile.close(); |
|
||||||
} |
|
||||||
|
|
||||||
QString result; |
|
||||||
|
|
||||||
if (name.length() > 0) |
|
||||||
{ |
|
||||||
result = name; |
|
||||||
if (version.length() > 0) |
|
||||||
{ |
|
||||||
result += " "; |
|
||||||
result += version; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return result; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
int UBAbstractWidget::widgetType(const QUrl& pUrl) |
|
||||||
{ |
|
||||||
QString mime = UBFileSystemUtils::mimeTypeFromFileName(pUrl.toString()); |
|
||||||
|
|
||||||
if (mime == "application/vnd.apple-widget") |
|
||||||
{ |
|
||||||
return UBWidgetType::Apple; |
|
||||||
} |
|
||||||
else if (mime == "application/widget") |
|
||||||
{ |
|
||||||
return UBWidgetType::W3C; |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
return UBWidgetType::Other; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void UBAbstractWidget::mousePressEvent(QMouseEvent *event) |
|
||||||
{ |
|
||||||
if(mIsFrozen) |
|
||||||
{ |
|
||||||
event->accept(); |
|
||||||
return; |
|
||||||
} |
|
||||||
UBRoutedMouseEventWebView::mousePressEvent(event); |
|
||||||
mMouseIsPressed = true; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void UBAbstractWidget::mouseMoveEvent(QMouseEvent *event) |
|
||||||
{ |
|
||||||
|
|
||||||
if(mIsFrozen) |
|
||||||
{ |
|
||||||
event->accept(); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
// TODO UB 4.x fix web kit mouse move routing
|
|
||||||
|
|
||||||
if (mFirstReleaseAfterMove) |
|
||||||
{ |
|
||||||
mFirstReleaseAfterMove = false; |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
UBRoutedMouseEventWebView::mouseMoveEvent(event); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void UBAbstractWidget::mouseReleaseEvent(QMouseEvent *event) |
|
||||||
{ |
|
||||||
if(mIsFrozen) |
|
||||||
{ |
|
||||||
event->accept(); |
|
||||||
return; |
|
||||||
} |
|
||||||
|
|
||||||
UBRoutedMouseEventWebView::mouseReleaseEvent(event); |
|
||||||
mMouseIsPressed = false; |
|
||||||
mFirstReleaseAfterMove = true; |
|
||||||
} |
|
||||||
|
|
||||||
QWebView * UBAbstractWidget::createWindow(QWebPage::WebWindowType type) |
|
||||||
{ |
|
||||||
if (type == QWebPage::WebBrowserWindow) |
|
||||||
{ |
|
||||||
UBApplication::applicationController->showInternet(); |
|
||||||
return UBApplication::webController->createNewTab(); |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
return this; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void UBAbstractWidget::injectInlineJavaScript() |
|
||||||
{ |
|
||||||
if (!sInlineJavaScriptLoaded) |
|
||||||
{ |
|
||||||
sInlineJavaScripts = UBApplication::applicationController->widgetInlineJavaScripts(); |
|
||||||
sInlineJavaScriptLoaded = true; |
|
||||||
} |
|
||||||
|
|
||||||
foreach(QString script, sInlineJavaScripts) |
|
||||||
{ |
|
||||||
QWebView::page()->mainFrame()->evaluateJavaScript(script); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void UBAbstractWidget::javaScriptWindowObjectCleared() |
|
||||||
{ |
|
||||||
injectInlineJavaScript(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void UBAbstractWidget::paintEvent(QPaintEvent * event) |
|
||||||
{ |
|
||||||
if (mIsFrozen) |
|
||||||
{ |
|
||||||
QPainter p(this); |
|
||||||
p.drawPixmap(0, 0, mSnapshot); |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
QWebView::paintEvent(event); |
|
||||||
} |
|
||||||
if (!mInitialLoadDone || mLoadIsErronous) |
|
||||||
{ |
|
||||||
QPainter p(this); |
|
||||||
QString message = tr("Loading ..."); |
|
||||||
|
|
||||||
// this is the right way of doing but we receive two callback and the one return always that the
|
|
||||||
// load as failed... to check
|
|
||||||
if (mInitialLoadDone && mLoadIsErronous) |
|
||||||
message = tr("Cannot load content"); |
|
||||||
else |
|
||||||
message = tr("Loading ..."); |
|
||||||
|
|
||||||
p.setFont(QFont("Arial", 12)); |
|
||||||
|
|
||||||
QFontMetrics fm = p.fontMetrics(); |
|
||||||
QRect txtBoundingRect = fm.boundingRect(message); |
|
||||||
|
|
||||||
txtBoundingRect.moveCenter(rect().center()); |
|
||||||
txtBoundingRect.adjust(-10, -5, 10, 5); |
|
||||||
|
|
||||||
p.setPen(Qt::NoPen); |
|
||||||
p.setBrush(UBSettings::paletteColor); |
|
||||||
p.drawRoundedRect(txtBoundingRect, 3, 3); |
|
||||||
|
|
||||||
p.setPen(Qt::white); |
|
||||||
p.drawText(rect(), Qt::AlignCenter, message); |
|
||||||
} |
|
||||||
} |
|
||||||
void UBAbstractWidget::dropEvent(QDropEvent *event) |
|
||||||
{ |
|
||||||
QWebView::dropEvent(event); |
|
||||||
} |
|
||||||
|
|
||||||
QPixmap UBAbstractWidget::takeSnapshot() |
|
||||||
{ |
|
||||||
mIsTakingSnapshot = true; |
|
||||||
|
|
||||||
QPixmap pix(size()); |
|
||||||
pix.fill(Qt::transparent); |
|
||||||
|
|
||||||
render(&pix); |
|
||||||
|
|
||||||
mIsTakingSnapshot = false; |
|
||||||
|
|
||||||
return pix; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void UBAbstractWidget::setSnapshot(const QPixmap& pix) |
|
||||||
{ |
|
||||||
mSnapshot = pix; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void UBAbstractWidget::freeze() |
|
||||||
{ |
|
||||||
QPixmap pix = takeSnapshot(); |
|
||||||
mIsFrozen = true; |
|
||||||
setSnapshot(pix); |
|
||||||
update(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void UBAbstractWidget::unFreeze() |
|
||||||
{ |
|
||||||
mIsFrozen = false; |
|
||||||
update(); |
|
||||||
} |
|
||||||
|
|
@ -1,155 +0,0 @@ |
|||||||
/*
|
|
||||||
* 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/ |
|
||||||
|
|
||||||
#ifndef UBABSTRACTWIDGET_H_ |
|
||||||
#define UBABSTRACTWIDGET_H_ |
|
||||||
|
|
||||||
#include <QtGui> |
|
||||||
#include <QtWebKit> |
|
||||||
|
|
||||||
#include "web/UBRoutedMouseEventWebView.h" |
|
||||||
|
|
||||||
|
|
||||||
struct UBWidgetType |
|
||||||
{ |
|
||||||
enum Enum |
|
||||||
{ |
|
||||||
W3C = 0, Apple, Other |
|
||||||
}; |
|
||||||
}; |
|
||||||
|
|
||||||
|
|
||||||
class UBAbstractWidget : public UBRoutedMouseEventWebView |
|
||||||
{ |
|
||||||
Q_OBJECT; |
|
||||||
|
|
||||||
public: |
|
||||||
UBAbstractWidget(const QUrl& pWidgetUrl, QWidget *parent = 0); |
|
||||||
virtual ~UBAbstractWidget(); |
|
||||||
|
|
||||||
void loadMainHtml(); |
|
||||||
|
|
||||||
QUrl mainHtml() |
|
||||||
{ |
|
||||||
return mMainHtmlUrl; |
|
||||||
} |
|
||||||
|
|
||||||
QUrl widgetUrl() |
|
||||||
{ |
|
||||||
return mWidgetUrl; |
|
||||||
} |
|
||||||
|
|
||||||
QString mainHtmlFileName() |
|
||||||
{ |
|
||||||
return mMainHtmlFileName; |
|
||||||
} |
|
||||||
|
|
||||||
bool hasEmbededObjects(); |
|
||||||
bool hasEmbededFlash(); |
|
||||||
|
|
||||||
void resize(qreal width, qreal height); |
|
||||||
|
|
||||||
QSize nominalSize() const |
|
||||||
{ |
|
||||||
return mNominalSize; |
|
||||||
} |
|
||||||
|
|
||||||
bool canBeContent(); |
|
||||||
bool canBeTool(); |
|
||||||
|
|
||||||
bool hasLoadedSuccessfully() const |
|
||||||
{ |
|
||||||
return (mInitialLoadDone && !mLoadIsErronous); |
|
||||||
} |
|
||||||
|
|
||||||
bool freezable() { return mIsFreezable;} |
|
||||||
bool resizable() { return mIsResizable;} |
|
||||||
|
|
||||||
static QString iconFilePath(const QUrl& pUrl); |
|
||||||
static QString widgetName(const QUrl& pUrl); |
|
||||||
static int widgetType(const QUrl& pUrl); |
|
||||||
|
|
||||||
bool isFrozen(){ return mIsFrozen;} |
|
||||||
|
|
||||||
QPixmap snapshot(){return mSnapshot;} |
|
||||||
void setSnapshot(const QPixmap& pix); |
|
||||||
|
|
||||||
QPixmap takeSnapshot(); |
|
||||||
|
|
||||||
public slots: |
|
||||||
void freeze(); |
|
||||||
void unFreeze(); |
|
||||||
|
|
||||||
signals: |
|
||||||
|
|
||||||
void geometryChangeRequested(const QRect & geom); |
|
||||||
|
|
||||||
protected: |
|
||||||
|
|
||||||
bool mMouseIsPressed; |
|
||||||
bool mFirstReleaseAfterMove; |
|
||||||
|
|
||||||
virtual bool event(QEvent *e); |
|
||||||
|
|
||||||
virtual void mousePressEvent(QMouseEvent *event); |
|
||||||
virtual void mouseMoveEvent(QMouseEvent *event); |
|
||||||
virtual void mouseReleaseEvent(QMouseEvent *event); |
|
||||||
|
|
||||||
virtual QWebView * createWindow(QWebPage::WebWindowType type); |
|
||||||
|
|
||||||
QUrl mMainHtmlUrl; |
|
||||||
QString mMainHtmlFileName; |
|
||||||
QUrl mWidgetUrl; |
|
||||||
QSize mNominalSize; |
|
||||||
bool mIsResizable; |
|
||||||
bool mInitialLoadDone; |
|
||||||
bool mLoadIsErronous; |
|
||||||
|
|
||||||
bool mIsFreezable; |
|
||||||
int mCanBeContent; |
|
||||||
int mCanBeTool; |
|
||||||
enum OSType |
|
||||||
{ |
|
||||||
type_NONE = 0, // 0000
|
|
||||||
type_WIN = 1, // 0001
|
|
||||||
type_MAC = 2, // 0010
|
|
||||||
type_UNIX = 4, // 0100
|
|
||||||
type_ALL = 7, // 0111
|
|
||||||
}; |
|
||||||
|
|
||||||
virtual void injectInlineJavaScript(); |
|
||||||
virtual void paintEvent(QPaintEvent * event); |
|
||||||
virtual void dropEvent(QDropEvent *); |
|
||||||
|
|
||||||
protected slots: |
|
||||||
|
|
||||||
void mainFrameLoadFinished(bool ok); |
|
||||||
|
|
||||||
private: |
|
||||||
|
|
||||||
static QStringList sInlineJavaScripts; |
|
||||||
static bool sInlineJavaScriptLoaded; |
|
||||||
|
|
||||||
bool mIsFrozen; |
|
||||||
QPixmap mSnapshot; |
|
||||||
|
|
||||||
bool mIsTakingSnapshot; |
|
||||||
|
|
||||||
private slots: |
|
||||||
void javaScriptWindowObjectCleared(); |
|
||||||
|
|
||||||
}; |
|
||||||
|
|
||||||
#endif /* UBABSTRACTWIDGET_H_ */ |
|
@ -1,48 +0,0 @@ |
|||||||
#include "UBAngleWidget.h" |
|
||||||
#include <QPainter> |
|
||||||
|
|
||||||
#include "core/memcheck.h" |
|
||||||
|
|
||||||
UBAngleWidget::UBAngleWidget(QWidget *parent) |
|
||||||
: QWidget(parent) |
|
||||||
{ |
|
||||||
this->setFixedSize(45,30); |
|
||||||
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); |
|
||||||
this->setAttribute(Qt::WA_TranslucentBackground); |
|
||||||
|
|
||||||
QImage mask_img(width(), height(), QImage::Format_Mono); |
|
||||||
mask_img.fill(0xff); |
|
||||||
QPainter mask_ptr(&mask_img); |
|
||||||
mask_ptr.setBrush( QBrush( QColor(0, 0, 0) ) ); |
|
||||||
mask_ptr.drawRoundedRect(0,0,this->geometry().width() - 6,this->geometry().height() - 6,1,1); |
|
||||||
bmpMask = QBitmap::fromImage(mask_img); |
|
||||||
this->setMask(bmpMask); |
|
||||||
} |
|
||||||
|
|
||||||
UBAngleWidget::~UBAngleWidget() |
|
||||||
{ |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
void UBAngleWidget::paintEvent(QPaintEvent *event) |
|
||||||
{ |
|
||||||
Q_UNUSED(event); |
|
||||||
|
|
||||||
this->move(this->cursor().pos().x(), this->cursor().pos().y() - 30); |
|
||||||
|
|
||||||
QPainter painter(this); |
|
||||||
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); |
|
||||||
QBrush brush(Qt::white); |
|
||||||
painter.setBrush(brush); |
|
||||||
painter.drawRoundedRect(1,1,this->geometry().width() - 10,this->geometry().height() - 10,1,1); |
|
||||||
|
|
||||||
painter.setPen(QColor(85,50,127)); |
|
||||||
painter.setFont(QFont("Arial", 10)); |
|
||||||
painter.drawText(1,1,this->geometry().width() - 10,this->geometry().height() - 10, Qt::AlignCenter, text); |
|
||||||
} |
|
||||||
|
|
||||||
void UBAngleWidget::setText(QString newText) |
|
||||||
{ |
|
||||||
text = newText; |
|
||||||
text.append(QChar(176)); |
|
||||||
} |
|
@ -1,25 +0,0 @@ |
|||||||
#ifndef UBANGLEWIDGET_H |
|
||||||
#define UBANGLEWIDGET_H |
|
||||||
|
|
||||||
#include <QWidget> |
|
||||||
#include <QBitmap> |
|
||||||
|
|
||||||
class UBAngleWidget : public QWidget |
|
||||||
{ |
|
||||||
Q_OBJECT |
|
||||||
|
|
||||||
public: |
|
||||||
UBAngleWidget(QWidget *parent = 0); |
|
||||||
~UBAngleWidget(); |
|
||||||
|
|
||||||
void setText(QString); |
|
||||||
|
|
||||||
protected: |
|
||||||
void paintEvent(QPaintEvent *event); |
|
||||||
|
|
||||||
private: |
|
||||||
QString text; |
|
||||||
QBitmap bmpMask; |
|
||||||
}; |
|
||||||
|
|
||||||
#endif // UBANGLEWIDGET_H
|
|
@ -1,77 +0,0 @@ |
|||||||
/*
|
|
||||||
* 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/ |
|
||||||
|
|
||||||
#include "UBAppleWidget.h" |
|
||||||
|
|
||||||
#include <QtNetwork> |
|
||||||
|
|
||||||
#include "web/UBWebKitUtils.h" |
|
||||||
|
|
||||||
#include "network/UBNetworkAccessManager.h" |
|
||||||
|
|
||||||
#include "core/memcheck.h" |
|
||||||
|
|
||||||
UBAppleWidget::UBAppleWidget(const QUrl& pWidgetUrl, QWidget *parent) |
|
||||||
: UBAbstractWidget(pWidgetUrl, parent) |
|
||||||
{ |
|
||||||
QString path = pWidgetUrl.toLocalFile(); |
|
||||||
|
|
||||||
if (!path.endsWith(".wdgt") && !path.endsWith(".wdgt/")) |
|
||||||
{ |
|
||||||
int lastSlashIndex = path.lastIndexOf("/"); |
|
||||||
if (lastSlashIndex > 0) |
|
||||||
{ |
|
||||||
path = path.mid(0, lastSlashIndex + 1); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
QFile plistFile(path + "/Info.plist"); |
|
||||||
plistFile.open(QFile::ReadOnly); |
|
||||||
|
|
||||||
QByteArray plistBin = plistFile.readAll(); |
|
||||||
QString plist = QString::fromUtf8(plistBin); |
|
||||||
|
|
||||||
int mainHtmlIndex = plist.indexOf("MainHTML"); |
|
||||||
int mainHtmlIndexStart = plist.indexOf("<string>", mainHtmlIndex); |
|
||||||
int mainHtmlIndexEnd = plist.indexOf("</string>", mainHtmlIndexStart); |
|
||||||
|
|
||||||
if (mainHtmlIndex > -1 && mainHtmlIndexStart > -1 && mainHtmlIndexEnd > -1) |
|
||||||
{ |
|
||||||
mMainHtmlFileName = plist.mid(mainHtmlIndexStart + 8, mainHtmlIndexEnd - mainHtmlIndexStart - 8); |
|
||||||
} |
|
||||||
|
|
||||||
mMainHtmlUrl = pWidgetUrl; |
|
||||||
mMainHtmlUrl.setPath(pWidgetUrl.path() + "/" + mMainHtmlFileName); |
|
||||||
|
|
||||||
QWebView::load(mMainHtmlUrl); |
|
||||||
|
|
||||||
QPixmap defaultPixmap(pWidgetUrl.toLocalFile() + "/Default.png"); |
|
||||||
|
|
||||||
setFixedSize(defaultPixmap.size()); |
|
||||||
|
|
||||||
mNominalSize = defaultPixmap.size(); |
|
||||||
} |
|
||||||
|
|
||||||
UBAppleWidget::~UBAppleWidget() |
|
||||||
{ |
|
||||||
// NOOP
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,36 +0,0 @@ |
|||||||
/*
|
|
||||||
* 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/ |
|
||||||
|
|
||||||
#ifndef UBAPPLEWIDGET_H_ |
|
||||||
#define UBAPPLEWIDGET_H_ |
|
||||||
|
|
||||||
#include <QtGui> |
|
||||||
#include <QtWebKit> |
|
||||||
|
|
||||||
#include "UBAbstractWidget.h" |
|
||||||
|
|
||||||
class UBItem; |
|
||||||
|
|
||||||
class UBAppleWidget : public UBAbstractWidget |
|
||||||
{ |
|
||||||
Q_OBJECT; |
|
||||||
|
|
||||||
public: |
|
||||||
UBAppleWidget(const QUrl& pWidgetUrl, QWidget *parent = 0); |
|
||||||
virtual ~UBAppleWidget(); |
|
||||||
|
|
||||||
}; |
|
||||||
|
|
||||||
#endif /* UBAPPLEWIDGET_H_ */ |
|
@ -0,0 +1,160 @@ |
|||||||
|
/*
|
||||||
|
* 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#include <QtGui> |
||||||
|
#include <QtWebKit> |
||||||
|
|
||||||
|
#include "UBGraphicsWebView.h" |
||||||
|
#include "UBGraphicsScene.h" |
||||||
|
#include "UBGraphicsItemDelegate.h" |
||||||
|
#include "UBGraphicsDelegateFrame.h" |
||||||
|
|
||||||
|
#include "core/memcheck.h" |
||||||
|
|
||||||
|
UBGraphicsWebView::UBGraphicsWebView(QGraphicsItem* parent) |
||||||
|
: QGraphicsWebView(parent) |
||||||
|
{ |
||||||
|
setData(UBGraphicsItemData::ItemLayerType, UBItemLayerType::Object); |
||||||
|
|
||||||
|
mDelegate = new UBGraphicsItemDelegate(this, 0, true, false, false); |
||||||
|
mDelegate->init(); |
||||||
|
|
||||||
|
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); |
||||||
|
|
||||||
|
QGraphicsWebView::setAcceptHoverEvents(true); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
UBGraphicsWebView::~UBGraphicsWebView() |
||||||
|
{ |
||||||
|
if (mDelegate) |
||||||
|
delete mDelegate; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
QVariant UBGraphicsWebView::itemChange(GraphicsItemChange change, const QVariant &value) |
||||||
|
{ |
||||||
|
if ((change == QGraphicsItem::ItemSelectedHasChanged) && scene()) { |
||||||
|
if (isSelected()) |
||||||
|
scene()->setActiveWindow(this); |
||||||
|
else |
||||||
|
if(scene()->activeWindow() == this) |
||||||
|
scene()->setActiveWindow(0); |
||||||
|
} |
||||||
|
|
||||||
|
QVariant newValue = mDelegate->itemChange(change, value); |
||||||
|
return QGraphicsWebView::itemChange(change, newValue); |
||||||
|
} |
||||||
|
|
||||||
|
void UBGraphicsWebView::setUuid(const QUuid &pUuid) |
||||||
|
{ |
||||||
|
UBItem::setUuid(pUuid); |
||||||
|
setData(UBGraphicsItemData::ItemUuid, QVariant(pUuid)); //store item uuid inside the QGraphicsItem to fast operations with Items on the scene
|
||||||
|
} |
||||||
|
|
||||||
|
void UBGraphicsWebView::mousePressEvent(QGraphicsSceneMouseEvent *event) |
||||||
|
{ |
||||||
|
if (!mDelegate->mousePressEvent(event)) |
||||||
|
setSelected(true); /* forcing selection */ |
||||||
|
|
||||||
|
QGraphicsWebView::mousePressEvent(event); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void UBGraphicsWebView::mouseMoveEvent(QGraphicsSceneMouseEvent *event) |
||||||
|
{ |
||||||
|
if (!mDelegate->mouseMoveEvent(event)) |
||||||
|
QGraphicsWebView::mouseMoveEvent(event); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void UBGraphicsWebView::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) |
||||||
|
{ |
||||||
|
mDelegate->mouseReleaseEvent(event); |
||||||
|
QGraphicsWebView::mouseReleaseEvent(event); |
||||||
|
} |
||||||
|
|
||||||
|
void UBGraphicsWebView::wheelEvent(QGraphicsSceneWheelEvent *event) |
||||||
|
{ |
||||||
|
if (mDelegate->weelEvent(event)) |
||||||
|
{ |
||||||
|
QGraphicsWebView::wheelEvent(event); |
||||||
|
event->accept(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void UBGraphicsWebView::hoverEnterEvent(QGraphicsSceneHoverEvent *event) |
||||||
|
{ |
||||||
|
Q_UNUSED(event) |
||||||
|
/* NOOP */ |
||||||
|
} |
||||||
|
void UBGraphicsWebView::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) |
||||||
|
{ |
||||||
|
Q_UNUSED(event) |
||||||
|
/* NOOP */ |
||||||
|
} |
||||||
|
|
||||||
|
void UBGraphicsWebView::setDelegate(UBGraphicsItemDelegate* pDelegate) |
||||||
|
{ |
||||||
|
if (mDelegate) |
||||||
|
delete mDelegate; |
||||||
|
|
||||||
|
mDelegate = pDelegate; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void UBGraphicsWebView::resize(qreal w, qreal h) |
||||||
|
{ |
||||||
|
UBGraphicsWebView::resize(QSizeF(w, h)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void UBGraphicsWebView::resize(const QSizeF & pSize) |
||||||
|
{ |
||||||
|
if (pSize != size()) { |
||||||
|
QGraphicsWebView::setMaximumSize(pSize.width(), pSize.height()); |
||||||
|
QGraphicsWebView::resize(pSize.width(), pSize.height()); |
||||||
|
if (mDelegate) |
||||||
|
mDelegate->positionHandles(); |
||||||
|
if (scene()) |
||||||
|
scene()->setModified(true); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
QSizeF UBGraphicsWebView::size() const |
||||||
|
{ |
||||||
|
return QGraphicsWebView::size(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
UBGraphicsScene* UBGraphicsWebView::scene() |
||||||
|
{ |
||||||
|
return static_cast<UBGraphicsScene*>(QGraphicsItem::scene()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void UBGraphicsWebView::remove() |
||||||
|
{ |
||||||
|
if (mDelegate) |
||||||
|
mDelegate->remove(true); |
||||||
|
} |
||||||
|
|
||||||
|
bool UBGraphicsWebView::event(QEvent *event) |
||||||
|
{ |
||||||
|
if (event->type() == QEvent::ShortcutOverride) |
||||||
|
event->accept(); |
||||||
|
|
||||||
|
return QGraphicsWebView::event(event); |
||||||
|
} |
@ -0,0 +1,62 @@ |
|||||||
|
/*
|
||||||
|
* 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef UBGRAPHICSWEBVIEW_H_ |
||||||
|
#define UBGRAPHICSWEBVIEW_H_ |
||||||
|
|
||||||
|
#include <QtGui> |
||||||
|
#include <QtWebKit> |
||||||
|
|
||||||
|
#include "UBItem.h" |
||||||
|
#include "UBResizableGraphicsItem.h" |
||||||
|
|
||||||
|
class UBGraphicsItemDelegate; |
||||||
|
|
||||||
|
class UBGraphicsWebView: public QGraphicsWebView, public UBItem, public UBResizableGraphicsItem, public UBGraphicsItem |
||||||
|
{ |
||||||
|
public: |
||||||
|
UBGraphicsWebView(QGraphicsItem* parent = 0); |
||||||
|
virtual ~UBGraphicsWebView(); |
||||||
|
|
||||||
|
virtual void resize(qreal w, qreal h); |
||||||
|
virtual void resize(const QSizeF & size); |
||||||
|
|
||||||
|
virtual QSizeF size() const; |
||||||
|
|
||||||
|
void setDelegate(UBGraphicsItemDelegate* pDelegate); |
||||||
|
|
||||||
|
virtual UBGraphicsScene* scene(); |
||||||
|
|
||||||
|
virtual void remove(); |
||||||
|
|
||||||
|
virtual UBGraphicsItemDelegate* Delegate() const { return mDelegate;} |
||||||
|
|
||||||
|
virtual void clearSource(){;} |
||||||
|
virtual void setUuid(const QUuid &pUuid); |
||||||
|
|
||||||
|
protected: |
||||||
|
|
||||||
|
virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); |
||||||
|
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); |
||||||
|
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); |
||||||
|
virtual void wheelEvent(QGraphicsSceneWheelEvent *event); |
||||||
|
virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event); |
||||||
|
virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); |
||||||
|
virtual bool event(QEvent *event); |
||||||
|
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); |
||||||
|
|
||||||
|
}; |
||||||
|
|
||||||
|
#endif /* UBGRAPHICSWEBVIEW_H_ */ |
@ -1,525 +0,0 @@ |
|||||||
/*
|
|
||||||
* 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/ |
|
||||||
|
|
||||||
#include "UBW3CWidget.h" |
|
||||||
|
|
||||||
#include <QtNetwork> |
|
||||||
#include <QtXml> |
|
||||||
|
|
||||||
#include "frameworks/UBPlatformUtils.h" |
|
||||||
#include "frameworks/UBFileSystemUtils.h" |
|
||||||
|
|
||||||
#include "core/UBApplication.h" |
|
||||||
#include "core/UBSettings.h" |
|
||||||
#include "api/UBWidgetUniboardAPI.h" |
|
||||||
|
|
||||||
#include "board/UBBoardController.h" |
|
||||||
|
|
||||||
#include "core/memcheck.h" |
|
||||||
|
|
||||||
|
|
||||||
bool UBW3CWidget::sTemplateLoaded = false; |
|
||||||
QMap<QString, QString> UBW3CWidget::sNPAPIWrapperTemplates; |
|
||||||
QString UBW3CWidget::sNPAPIWrappperConfigTemplate; |
|
||||||
|
|
||||||
|
|
||||||
UBW3CWidget::UBW3CWidget(const QUrl& pWidgetUrl, QWidget *parent) |
|
||||||
: UBAbstractWidget(pWidgetUrl, parent) |
|
||||||
|
|
||||||
{ |
|
||||||
QString path = pWidgetUrl.toLocalFile(); |
|
||||||
QDir potentialDir(path); |
|
||||||
|
|
||||||
if (!path.endsWith(".wgt") && !path.endsWith(".wgt/") && !potentialDir.exists()) |
|
||||||
{ |
|
||||||
int lastSlashIndex = path.lastIndexOf("/"); |
|
||||||
if (lastSlashIndex > 0) |
|
||||||
{ |
|
||||||
path = path.mid(0, lastSlashIndex + 1); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if(!path.endsWith("/")) |
|
||||||
path += "/"; |
|
||||||
|
|
||||||
int width = 300; |
|
||||||
int height = 150; |
|
||||||
|
|
||||||
QFile configFile(path + "config.xml"); |
|
||||||
configFile.open(QFile::ReadOnly); |
|
||||||
|
|
||||||
QDomDocument doc; |
|
||||||
doc.setContent(configFile.readAll()); |
|
||||||
QDomNodeList widgetDomList = doc.elementsByTagName("widget"); |
|
||||||
|
|
||||||
if (widgetDomList.count() > 0) |
|
||||||
{ |
|
||||||
QDomElement widgetElement = widgetDomList.item(0).toElement(); |
|
||||||
|
|
||||||
width = widgetElement.attribute("width", "300").toInt(); |
|
||||||
height = widgetElement.attribute("height", "150").toInt(); |
|
||||||
|
|
||||||
mMetadatas.id = widgetElement.attribute("id", ""); |
|
||||||
|
|
||||||
//some early widget (<= 4.3.4) where using identifier instead of id
|
|
||||||
if (mMetadatas.id.length() == 0) |
|
||||||
mMetadatas.id = widgetElement.attribute("identifier", ""); |
|
||||||
|
|
||||||
mMetadatas.version = widgetElement.attribute("version", ""); |
|
||||||
|
|
||||||
// TODO UB 4.x map properly ub namespace
|
|
||||||
mIsResizable = widgetElement.attribute("ub:resizable", "false") == "true"; |
|
||||||
mIsFreezable = widgetElement.attribute("ub:freezable", "true") == "true"; |
|
||||||
|
|
||||||
QString roles = widgetElement.attribute("ub:roles", "content tool").trimmed().toLower(); |
|
||||||
|
|
||||||
//------------------------------//
|
|
||||||
|
|
||||||
if( roles == "" || roles.contains("tool") ) |
|
||||||
{ |
|
||||||
mCanBeTool = UBAbstractWidget::type_ALL; |
|
||||||
} |
|
||||||
|
|
||||||
if( roles.contains("twin") ) |
|
||||||
{ |
|
||||||
mCanBeTool |= UBAbstractWidget::type_WIN; |
|
||||||
} |
|
||||||
|
|
||||||
if( roles.contains("tmac") ) |
|
||||||
{ |
|
||||||
mCanBeTool |= UBAbstractWidget::type_MAC; |
|
||||||
} |
|
||||||
|
|
||||||
if( roles.contains("tunix") ) |
|
||||||
{ |
|
||||||
mCanBeTool |= UBAbstractWidget::type_UNIX; |
|
||||||
} |
|
||||||
|
|
||||||
//---------//
|
|
||||||
|
|
||||||
if( roles == "" || roles.contains("content") ) |
|
||||||
{ |
|
||||||
mCanBeContent = UBAbstractWidget::type_ALL; |
|
||||||
} |
|
||||||
|
|
||||||
if( roles.contains("cwin") ) |
|
||||||
{ |
|
||||||
mCanBeContent |= UBAbstractWidget::type_WIN; |
|
||||||
} |
|
||||||
|
|
||||||
if( roles.contains("cmac") ) |
|
||||||
{ |
|
||||||
mCanBeContent |= UBAbstractWidget::type_MAC; |
|
||||||
} |
|
||||||
|
|
||||||
if( roles.contains("cunix") ) |
|
||||||
{ |
|
||||||
mCanBeContent |= UBAbstractWidget::type_UNIX; |
|
||||||
} |
|
||||||
|
|
||||||
//------------------------------//
|
|
||||||
|
|
||||||
QDomNodeList contentDomList = widgetElement.elementsByTagName("content"); |
|
||||||
|
|
||||||
if (contentDomList.count() > 0) |
|
||||||
{ |
|
||||||
QDomElement contentElement = contentDomList.item(0).toElement(); |
|
||||||
|
|
||||||
mMainHtmlFileName = contentElement.attribute("src", ""); |
|
||||||
} |
|
||||||
|
|
||||||
mMetadatas.name = textForSubElementByLocale(widgetElement, "name", locale()); |
|
||||||
mMetadatas.description = textForSubElementByLocale(widgetElement, "description ", locale()); |
|
||||||
|
|
||||||
QDomNodeList authorDomList = widgetElement.elementsByTagName("author"); |
|
||||||
|
|
||||||
if (authorDomList.count() > 0) |
|
||||||
{ |
|
||||||
QDomElement authorElement = authorDomList.item(0).toElement(); |
|
||||||
|
|
||||||
mMetadatas.author = authorElement.text(); |
|
||||||
mMetadatas.authorHref = authorElement.attribute("href", ""); |
|
||||||
mMetadatas.authorEmail = authorElement.attribute("email ", ""); |
|
||||||
} |
|
||||||
|
|
||||||
QDomNodeList propertiesDomList = widgetElement.elementsByTagName("preference"); |
|
||||||
|
|
||||||
for (uint i = 0; i < propertiesDomList.length(); i++) |
|
||||||
{ |
|
||||||
QDomElement preferenceElement = propertiesDomList.at(i).toElement(); |
|
||||||
QString prefName = preferenceElement.attribute("name", ""); |
|
||||||
|
|
||||||
if (prefName.length() > 0) |
|
||||||
{ |
|
||||||
QString prefValue = preferenceElement.attribute("value", ""); |
|
||||||
bool readOnly = (preferenceElement.attribute("readonly", "false") == "true"); |
|
||||||
|
|
||||||
mPreferences.insert(prefName, PreferenceValue(prefValue, readOnly)); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if (mMainHtmlFileName.length() == 0) |
|
||||||
{ |
|
||||||
QFile defaultStartFile(path + "index.htm"); |
|
||||||
|
|
||||||
if (defaultStartFile.exists()) |
|
||||||
{ |
|
||||||
mMainHtmlFileName = "index.htm"; |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
QFile secondDefaultStartFile(path + "index.html"); |
|
||||||
|
|
||||||
if (secondDefaultStartFile.exists()) |
|
||||||
{ |
|
||||||
mMainHtmlFileName = "index.html"; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
mMainHtmlUrl = pWidgetUrl; |
|
||||||
mMainHtmlUrl.setPath(pWidgetUrl.path() + "/" + mMainHtmlFileName); |
|
||||||
// is it a valid local file ?
|
|
||||||
QFile f(mMainHtmlUrl.toLocalFile()); |
|
||||||
|
|
||||||
if(!f.exists()) |
|
||||||
mMainHtmlUrl = QUrl(mMainHtmlFileName); |
|
||||||
|
|
||||||
connect(page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(javaScriptWindowObjectCleared())); |
|
||||||
connect(UBApplication::boardController, SIGNAL(activeSceneChanged()), this, SLOT(javaScriptWindowObjectCleared())); |
|
||||||
|
|
||||||
QWebView::load(mMainHtmlUrl); |
|
||||||
|
|
||||||
setFixedSize(QSize(width, height)); |
|
||||||
|
|
||||||
mNominalSize = QSize(width, height); |
|
||||||
} |
|
||||||
|
|
||||||
UBW3CWidget::~UBW3CWidget() |
|
||||||
{ |
|
||||||
// NOOP
|
|
||||||
} |
|
||||||
|
|
||||||
void UBW3CWidget::javaScriptWindowObjectCleared() |
|
||||||
{ |
|
||||||
UBWidgetUniboardAPI *uniboardAPI = new UBWidgetUniboardAPI(UBApplication::boardController->activeScene(), 0); |
|
||||||
|
|
||||||
page()->mainFrame()->addToJavaScriptWindowObject("sankore", uniboardAPI); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
bool UBW3CWidget::hasNPAPIWrapper(const QString& pMimeType) |
|
||||||
{ |
|
||||||
loadNPAPIWrappersTemplates(); |
|
||||||
|
|
||||||
return sNPAPIWrapperTemplates.contains(pMimeType); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
QString UBW3CWidget::createNPAPIWrapper(const QString& url, |
|
||||||
const QString& pMimeType, const QSize& sizeHint, const QString& pName) |
|
||||||
{ |
|
||||||
const QString userWidgetPath = UBSettings::settings()->userInteractiveDirectory() + "/" + tr("Web"); |
|
||||||
QDir userWidgetDir(userWidgetPath); |
|
||||||
|
|
||||||
return createNPAPIWrapperInDir(url, userWidgetDir, pMimeType, sizeHint, pName); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
QString UBW3CWidget::createNPAPIWrapperInDir(const QString& pUrl, const QDir& pDir, |
|
||||||
const QString& pMimeType, const QSize& sizeHint, |
|
||||||
const QString& pName) |
|
||||||
{ |
|
||||||
QString url = pUrl; |
|
||||||
url = UBFileSystemUtils::removeLocalFilePrefix(url); |
|
||||||
QString name = pName; |
|
||||||
|
|
||||||
QFileInfo fi(url); |
|
||||||
|
|
||||||
if (name.length() == 0) |
|
||||||
name = fi.baseName(); |
|
||||||
|
|
||||||
if (fi.exists()){ |
|
||||||
url = fi.fileName(); |
|
||||||
} |
|
||||||
|
|
||||||
loadNPAPIWrappersTemplates(); |
|
||||||
|
|
||||||
QString htmlTemplate; |
|
||||||
|
|
||||||
if (pMimeType.length() > 0 && sNPAPIWrapperTemplates.contains(pMimeType)){ |
|
||||||
htmlTemplate = sNPAPIWrapperTemplates.value(pMimeType); |
|
||||||
} |
|
||||||
else { |
|
||||||
QString extension = UBFileSystemUtils::extension(url); |
|
||||||
|
|
||||||
if (sNPAPIWrapperTemplates.contains(extension)) |
|
||||||
htmlTemplate = sNPAPIWrapperTemplates.value(extension); |
|
||||||
} |
|
||||||
|
|
||||||
if (htmlTemplate.length() > 0){ |
|
||||||
htmlTemplate = htmlTemplate.replace(QString("{in.url}"), url) |
|
||||||
.replace(QString("{in.width}"), QString("%1").arg(sizeHint.width())) |
|
||||||
.replace(QString("{in.height}"), QString("%1").arg(sizeHint.height())); |
|
||||||
|
|
||||||
QString configTemplate = sNPAPIWrappperConfigTemplate |
|
||||||
.replace(QString("{in.id}"), url) |
|
||||||
.replace(QString("{in.width}"), QString("%1").arg(sizeHint.width())) |
|
||||||
.replace(QString("{in.height}"), QString("%1").arg(sizeHint.height())) |
|
||||||
.replace(QString("{in.name}"), name) |
|
||||||
.replace(QString("{in.startFile}"), QString("index.htm")); |
|
||||||
|
|
||||||
QString dirPath = pDir.path(); |
|
||||||
if (!pDir.exists()) |
|
||||||
pDir.mkpath(dirPath); |
|
||||||
|
|
||||||
QString widgetLibraryPath = dirPath + "/" + name + ".wgt"; |
|
||||||
QDir widgetLibraryDir(widgetLibraryPath); |
|
||||||
|
|
||||||
if (widgetLibraryDir.exists()) |
|
||||||
{ |
|
||||||
if (!UBFileSystemUtils::deleteDir(widgetLibraryDir.path())) |
|
||||||
{ |
|
||||||
qWarning() << "Cannot delete old widget " << widgetLibraryDir.path(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
widgetLibraryDir.mkpath(widgetLibraryPath); |
|
||||||
if (fi.exists()){ |
|
||||||
QString target = widgetLibraryPath + "/" + fi.fileName(); |
|
||||||
QString source = pUrl; |
|
||||||
source = UBFileSystemUtils::removeLocalFilePrefix(source); |
|
||||||
QFile::copy(source, target); |
|
||||||
} |
|
||||||
|
|
||||||
QFile configFile(widgetLibraryPath + "/config.xml"); |
|
||||||
|
|
||||||
if (!configFile.open(QIODevice::WriteOnly)) |
|
||||||
{ |
|
||||||
qWarning() << "Cannot open file " << configFile.fileName(); |
|
||||||
return ""; |
|
||||||
} |
|
||||||
|
|
||||||
QTextStream outConfig(&configFile); |
|
||||||
outConfig.setCodec("UTF-8"); |
|
||||||
|
|
||||||
outConfig << configTemplate; |
|
||||||
configFile.close(); |
|
||||||
|
|
||||||
QFile indexFile(widgetLibraryPath + "/index.htm"); |
|
||||||
|
|
||||||
if (!indexFile.open(QIODevice::WriteOnly)) |
|
||||||
{ |
|
||||||
qWarning() << "Cannot open file " << indexFile.fileName(); |
|
||||||
return ""; |
|
||||||
} |
|
||||||
|
|
||||||
QTextStream outIndex(&indexFile); |
|
||||||
outIndex.setCodec("UTF-8"); |
|
||||||
|
|
||||||
outIndex << htmlTemplate; |
|
||||||
indexFile.close(); |
|
||||||
|
|
||||||
return widgetLibraryPath; |
|
||||||
} |
|
||||||
else |
|
||||||
{ |
|
||||||
return ""; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
QString UBW3CWidget::createHtmlWrapperInDir(const QString& html, const QDir& pDir, |
|
||||||
const QSize& sizeHint, const QString& pName) |
|
||||||
{ |
|
||||||
|
|
||||||
QString widgetPath = pDir.path() + "/" + pName + ".wgt"; |
|
||||||
widgetPath = UBFileSystemUtils::nextAvailableFileName(widgetPath); |
|
||||||
QDir widgetDir(widgetPath); |
|
||||||
|
|
||||||
if (!widgetDir.exists()) |
|
||||||
{ |
|
||||||
widgetDir.mkpath(widgetDir.path()); |
|
||||||
} |
|
||||||
|
|
||||||
QFile configFile(widgetPath + "/" + "config.xml"); |
|
||||||
|
|
||||||
if (configFile.exists()) |
|
||||||
{ |
|
||||||
configFile.remove(configFile.fileName()); |
|
||||||
} |
|
||||||
|
|
||||||
if (!configFile.open(QIODevice::WriteOnly)) |
|
||||||
{ |
|
||||||
qWarning() << "Cannot open file " << configFile.fileName(); |
|
||||||
return ""; |
|
||||||
} |
|
||||||
|
|
||||||
QTextStream outConfig(&configFile); |
|
||||||
outConfig.setCodec("UTF-8"); |
|
||||||
outConfig << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl; |
|
||||||
outConfig << "<widget xmlns=\"http://www.w3.org/ns/widgets\"" << endl; |
|
||||||
outConfig << " xmlns:ub=\"http://uniboard.mnemis.com/widgets\"" << endl; |
|
||||||
outConfig << " id=\"http://uniboard.mnemis.com/" << pName << "\"" <<endl; |
|
||||||
|
|
||||||
outConfig << " version=\"1.0\"" << endl; |
|
||||||
outConfig << " width=\"" << sizeHint.width() << "\"" << endl; |
|
||||||
outConfig << " height=\"" << sizeHint.height() << "\"" << endl; |
|
||||||
outConfig << " ub:resizable=\"true\">" << endl; |
|
||||||
|
|
||||||
outConfig << " <name>" << pName << "</name>" << endl; |
|
||||||
outConfig << " <content src=\"" << pName << ".html\"/>" << endl; |
|
||||||
|
|
||||||
outConfig << "</widget>" << endl; |
|
||||||
|
|
||||||
configFile.close(); |
|
||||||
|
|
||||||
const QString fullHtmlFileName = widgetPath + "/" + pName + ".html"; |
|
||||||
|
|
||||||
QFile widgetHtmlFile(fullHtmlFileName); |
|
||||||
if (widgetHtmlFile.exists()) |
|
||||||
{ |
|
||||||
widgetHtmlFile.remove(widgetHtmlFile.fileName()); |
|
||||||
} |
|
||||||
if (!widgetHtmlFile.open(QIODevice::WriteOnly)) |
|
||||||
{ |
|
||||||
qWarning() << "cannot open file " << widgetHtmlFile.fileName(); |
|
||||||
return ""; |
|
||||||
} |
|
||||||
|
|
||||||
QTextStream outStartFile(&widgetHtmlFile); |
|
||||||
outStartFile.setCodec("UTF-8"); |
|
||||||
|
|
||||||
outStartFile << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">" << endl; |
|
||||||
outStartFile << "<html>" << endl; |
|
||||||
outStartFile << "<head>" << endl; |
|
||||||
outStartFile << " <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">" << endl; |
|
||||||
outStartFile << "</head>" << endl; |
|
||||||
outStartFile << " <body>" << endl; |
|
||||||
outStartFile << html << endl; |
|
||||||
outStartFile << " </body>" << endl; |
|
||||||
outStartFile << "</html>" << endl; |
|
||||||
|
|
||||||
widgetHtmlFile.close(); |
|
||||||
|
|
||||||
return widgetPath; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
QString UBW3CWidget::freezedWidgetPage() |
|
||||||
{ |
|
||||||
static QString defaultcontent; |
|
||||||
|
|
||||||
if (defaultcontent.isNull()) { |
|
||||||
QString freezedWidgetDefaultContentFilePath = freezedWidgetFilePath(); |
|
||||||
QFile wrapperFile(freezedWidgetDefaultContentFilePath); |
|
||||||
if (!wrapperFile.open(QIODevice::ReadOnly | QIODevice::Text)) { |
|
||||||
qDebug() << "can't open wrapper file " + freezedWidgetDefaultContentFilePath; |
|
||||||
defaultcontent = ""; |
|
||||||
} else { |
|
||||||
QByteArray arr = wrapperFile.readAll(); |
|
||||||
if (!arr.isEmpty()) { |
|
||||||
defaultcontent = QString(arr); |
|
||||||
} else { |
|
||||||
qDebug() << "content of " + freezedWidgetDefaultContentFilePath + "is empty"; |
|
||||||
defaultcontent = ""; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return defaultcontent; |
|
||||||
} |
|
||||||
|
|
||||||
QString UBW3CWidget::freezedWidgetFilePath() |
|
||||||
{ |
|
||||||
return UBPlatformUtils::applicationResourcesDirectory() + "/etc/" + "freezedWidgetWrapper.html"; |
|
||||||
} |
|
||||||
|
|
||||||
void UBW3CWidget::loadNPAPIWrappersTemplates() |
|
||||||
{ |
|
||||||
if (!sTemplateLoaded) |
|
||||||
{ |
|
||||||
sNPAPIWrapperTemplates.clear(); |
|
||||||
|
|
||||||
QString etcPath = UBPlatformUtils::applicationResourcesDirectory() + "/etc/"; |
|
||||||
|
|
||||||
QDir etcDir(etcPath); |
|
||||||
|
|
||||||
foreach(QString fileName, etcDir.entryList()) |
|
||||||
{ |
|
||||||
if (fileName.startsWith("npapi-wrapper") && (fileName.endsWith(".htm") || fileName.endsWith(".html"))) |
|
||||||
{ |
|
||||||
|
|
||||||
QString htmlContent = UBFileSystemUtils::readTextFile(etcPath + fileName); |
|
||||||
|
|
||||||
if (htmlContent.length() > 0) |
|
||||||
{ |
|
||||||
QStringList tokens = fileName.split("."); |
|
||||||
|
|
||||||
if (tokens.length() >= 4) |
|
||||||
{ |
|
||||||
QString mime = tokens.at(tokens.length() - 4 ); |
|
||||||
mime += "/" + tokens.at(tokens.length() - 3); |
|
||||||
|
|
||||||
QString fileExtension = tokens.at(tokens.length() - 2); |
|
||||||
|
|
||||||
sNPAPIWrapperTemplates.insert(mime, htmlContent); |
|
||||||
sNPAPIWrapperTemplates.insert(fileExtension, htmlContent); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
sNPAPIWrappperConfigTemplate = UBFileSystemUtils::readTextFile(etcPath + "npapi-wrapper.config.xml"); |
|
||||||
|
|
||||||
sTemplateLoaded = true; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
QString UBW3CWidget::textForSubElementByLocale(QDomElement rootElement, QString subTagName, QLocale locale) |
|
||||||
{ |
|
||||||
QDomNodeList subList = rootElement.elementsByTagName(subTagName); |
|
||||||
|
|
||||||
QString lang = locale.name(); |
|
||||||
|
|
||||||
if (lang.length() > 2) |
|
||||||
lang[2] = QLatin1Char('-'); |
|
||||||
|
|
||||||
if (subList.count() > 1) |
|
||||||
{ |
|
||||||
for(int i = 0; i < subList.count(); i++) |
|
||||||
{ |
|
||||||
QDomNode node = subList.at(i); |
|
||||||
QDomElement element = node.toElement(); |
|
||||||
|
|
||||||
QString configLang = element.attribute("xml:lang", ""); |
|
||||||
|
|
||||||
if(lang == configLang || (configLang.length() == 2 && configLang == lang.left(2))) |
|
||||||
return element.text(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if (subList.count() >= 1) |
|
||||||
{ |
|
||||||
QDomElement element = subList.item(0).toElement(); |
|
||||||
return element.text(); |
|
||||||
} |
|
||||||
|
|
||||||
return ""; |
|
||||||
} |
|
||||||
|
|
@ -1,126 +0,0 @@ |
|||||||
/*
|
|
||||||
* 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/ |
|
||||||
|
|
||||||
#ifndef UBW3CWIDGET_H_ |
|
||||||
#define UBW3CWIDGET_H_ |
|
||||||
|
|
||||||
#include <QtGui> |
|
||||||
#include <QtWebKit> |
|
||||||
#include <QtXml> |
|
||||||
|
|
||||||
/*
|
|
||||||
* wrapper for w3c widget 1.0 as define in http://www.w3.org/TR/widgets/
|
|
||||||
*/ |
|
||||||
|
|
||||||
#include "UBAbstractWidget.h" |
|
||||||
|
|
||||||
class UBItem; |
|
||||||
|
|
||||||
class UBW3CWidget : public UBAbstractWidget |
|
||||||
{ |
|
||||||
Q_OBJECT; |
|
||||||
|
|
||||||
public: |
|
||||||
UBW3CWidget(const QUrl& pWidgetUrl, QWidget *parent = 0); |
|
||||||
|
|
||||||
virtual ~UBW3CWidget(); |
|
||||||
|
|
||||||
static QString createNPAPIWrapper(const QString& url, |
|
||||||
const QString& pMimeType = QString(), const QSize& sizeHint = QSize(300, 150), |
|
||||||
const QString& pName = QString()); |
|
||||||
|
|
||||||
static QString createNPAPIWrapperInDir(const QString& url, const QDir& pDir, |
|
||||||
const QString& pMimeType = QString(), const QSize& sizeHint = QSize(300, 150), |
|
||||||
const QString& pName = QString()); |
|
||||||
|
|
||||||
static QString createHtmlWrapperInDir(const QString& html, const QDir& pDir, |
|
||||||
const QSize& sizeHint, const QString& pName); |
|
||||||
|
|
||||||
static QString freezedWidgetPage(); |
|
||||||
|
|
||||||
static QString freezedWidgetFilePath(); |
|
||||||
|
|
||||||
static bool hasNPAPIWrapper(const QString& pMimeType); |
|
||||||
|
|
||||||
class PreferenceValue |
|
||||||
{ |
|
||||||
public: |
|
||||||
|
|
||||||
PreferenceValue() |
|
||||||
{ |
|
||||||
// NOOP
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
PreferenceValue(const QString& pValue, bool pReadonly) |
|
||||||
{ |
|
||||||
value = pValue; |
|
||||||
readonly = pReadonly; |
|
||||||
} |
|
||||||
|
|
||||||
QString value; |
|
||||||
bool readonly; |
|
||||||
}; |
|
||||||
|
|
||||||
class Metadata |
|
||||||
{ |
|
||||||
public: |
|
||||||
QString id; |
|
||||||
QString name; |
|
||||||
QString description; |
|
||||||
QString author; |
|
||||||
QString authorEmail; |
|
||||||
QString authorHref; |
|
||||||
QString version; |
|
||||||
}; |
|
||||||
|
|
||||||
|
|
||||||
QMap<QString, PreferenceValue> preferences() |
|
||||||
{ |
|
||||||
return mPreferences; |
|
||||||
} |
|
||||||
|
|
||||||
Metadata metadatas() const |
|
||||||
{ |
|
||||||
return mMetadatas; |
|
||||||
} |
|
||||||
|
|
||||||
private: |
|
||||||
|
|
||||||
QMap<QString, PreferenceValue> mPreferences; |
|
||||||
|
|
||||||
static bool sTemplateLoaded; |
|
||||||
|
|
||||||
static QMap<QString, QString> sNPAPIWrapperTemplates; |
|
||||||
|
|
||||||
static QString sNPAPIWrappperConfigTemplate; |
|
||||||
|
|
||||||
static void loadNPAPIWrappersTemplates(); |
|
||||||
|
|
||||||
static QString textForSubElementByLocale(QDomElement rootElement, QString subTagName, QLocale locale); |
|
||||||
|
|
||||||
// w3c metadata widget attributes
|
|
||||||
//
|
|
||||||
// http://www.w3.org/TR/widgets/#widget0
|
|
||||||
|
|
||||||
Metadata mMetadatas; |
|
||||||
|
|
||||||
private slots: |
|
||||||
|
|
||||||
void javaScriptWindowObjectCleared(); |
|
||||||
|
|
||||||
}; |
|
||||||
|
|
||||||
#endif /* UBW3CWIDGET_H_ */ |
|
@ -1,100 +0,0 @@ |
|||||||
/*
|
|
||||||
* 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/ |
|
||||||
|
|
||||||
#include "UBRoutedMouseEventWebView.h" |
|
||||||
|
|
||||||
#include <QtCore> |
|
||||||
#include <QtWebKit> |
|
||||||
#include <QtGui> |
|
||||||
|
|
||||||
#include "core/memcheck.h" |
|
||||||
|
|
||||||
UBRoutedMouseEventWebView::UBRoutedMouseEventWebView(QWidget * parent) |
|
||||||
: QWebView(parent) |
|
||||||
{ |
|
||||||
QWebView::setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform); |
|
||||||
} |
|
||||||
|
|
||||||
UBRoutedMouseEventWebView::~UBRoutedMouseEventWebView() |
|
||||||
{ |
|
||||||
// NOOP
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void UBRoutedMouseEventWebView::mouseMoveEvent(QMouseEvent* ev) |
|
||||||
{ |
|
||||||
QWebPage* p = page(); |
|
||||||
|
|
||||||
if (p) |
|
||||||
{ |
|
||||||
p->event(ev); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void UBRoutedMouseEventWebView::mousePressEvent(QMouseEvent* ev) |
|
||||||
{ |
|
||||||
QWebPage* p = page(); |
|
||||||
|
|
||||||
if (p) |
|
||||||
{ |
|
||||||
p->event(ev); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void UBRoutedMouseEventWebView::mouseDoubleClickEvent(QMouseEvent* ev) |
|
||||||
{ |
|
||||||
QWebPage* p = page(); |
|
||||||
|
|
||||||
if (p) |
|
||||||
{ |
|
||||||
p->event(ev); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void UBRoutedMouseEventWebView::mouseReleaseEvent(QMouseEvent* ev) |
|
||||||
{ |
|
||||||
QWebPage* p = page(); |
|
||||||
|
|
||||||
if (p) |
|
||||||
{ |
|
||||||
p->event(ev); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
void UBRoutedMouseEventWebView::contextMenuEvent(QContextMenuEvent* ev) |
|
||||||
{ |
|
||||||
QWebPage* p = page(); |
|
||||||
|
|
||||||
if (p) |
|
||||||
{ |
|
||||||
p->event(ev); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void UBRoutedMouseEventWebView::wheelEvent(QWheelEvent* ev) |
|
||||||
{ |
|
||||||
QWebPage* p = page(); |
|
||||||
|
|
||||||
if (p) |
|
||||||
{ |
|
||||||
p->event(ev); |
|
||||||
} |
|
||||||
} |
|
||||||
//void UBRoutedMouseEventWebView::dropEvent(QDropEvent *event)
|
|
||||||
//{
|
|
||||||
//// QWebView::dropEvent(event);
|
|
||||||
// event->accept();
|
|
||||||
//}
|
|
@ -1,45 +0,0 @@ |
|||||||
/*
|
|
||||||
* 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/ |
|
||||||
|
|
||||||
#ifndef UBROUTEDMOUSEEVENTWEBVIEW_H_ |
|
||||||
#define UBROUTEDMOUSEEVENTWEBVIEW_H_ |
|
||||||
|
|
||||||
#include <QtWebKit> |
|
||||||
|
|
||||||
/*
|
|
||||||
* This class changes the routing of mouse events. |
|
||||||
* Qt 4.5.2 does not report back the "accepted" flag set |
|
||||||
* by WebKit, as we want to know if a mouse event has been |
|
||||||
* consumed by webKit, we override them without keeping the |
|
||||||
* accepted flag status |
|
||||||
*/ |
|
||||||
|
|
||||||
class UBRoutedMouseEventWebView : public QWebView |
|
||||||
{ |
|
||||||
public: |
|
||||||
UBRoutedMouseEventWebView(QWidget * parent = 0 ); |
|
||||||
virtual ~UBRoutedMouseEventWebView(); |
|
||||||
|
|
||||||
protected: |
|
||||||
virtual void mouseMoveEvent(QMouseEvent* ev); |
|
||||||
virtual void mousePressEvent(QMouseEvent* ev); |
|
||||||
virtual void mouseDoubleClickEvent(QMouseEvent* ev); |
|
||||||
virtual void mouseReleaseEvent(QMouseEvent* ev); |
|
||||||
virtual void contextMenuEvent(QContextMenuEvent* ev); |
|
||||||
virtual void wheelEvent(QWheelEvent* ev); |
|
||||||
// virtual void dropEvent(QDropEvent *);
|
|
||||||
}; |
|
||||||
|
|
||||||
#endif /* UBROUTEDMOUSEEVENTWEBVIEW_H_ */ |
|