Commit 22b68c8a authored by Ilia Ryabokon's avatar Ilia Ryabokon

Merge conflict resolved

parents f6ac9f82 ef62f593
html, body{
width: 100%;
padding: 0;
height: auto;
background-color: white;
margin: 0;
}
::-webkit-scrollbar {
width: 14px;
background-color:white;
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
background-color:lightgray;
border: 2px solid gray;
}
::-webkit-scrollbar-button:vertical:start{
border-radius: 10px;
background-color:lightgray;
background-image: url(../images/trgUp.png);
background-size: 8px auto;
background-position: center;
background-repeat: no-repeat;
border: 2px solid gray;
}
::-webkit-scrollbar-button:vertical:end{
border-radius: 10px;
background-color:lightgray;
background-image: url(../images/trgDown.png);
background-size: 8px auto;
background-position: center;
background-repeat: no-repeat;
border: 2px solid gray;
}
a {
text-decoration: underline;
}
#disc_nav_cont{
height: auto;
position: fixed;
left: 0;
bottom: 0;
width: 100%;
}
.disclaimer{
padding: 5px;
text-align: center;
background-color: #BBBBBB;
border-top: solid 4px #EEEEEE;
border-bottom: none;
font-size: 12px;
}
.resultFooter{
width: 100%;
padding: 3px;
font-family: Verdana,Arial,Helvetica,sans-serif;
font-weight: bold;
font-size: x-large;
text-align: center;
background-color: white;
}
#searchResult {
overflow: hidden;
text-align: center;
margin-top: 50px;
margin-bottom: 50px;
}
.search{
position: fixed;
top: 0;
left: 0;
padding: 5px;
background-color: #BBBBBB;
border-bottom: solid 4px #EEEEEE;
}
.search,
.disclaimer {
width: 100%;
box-sizing: border-box;
-webkit-box-sizing: border-box;
}
.searchInput{
padding: 3px;
float: left;
width: 100%;
border-radius: 3px;
border-style: none;
height: 22px;
line-height: 18px;
vertical-align: middle;
box-sizing: border-box;
-webkit-box-sizing: border-box;
}
.searchButton{
background: url("../images/search_app.png") -38px -38px no-repeat;
width: 24px;
height: 24px;
overflow: hidden;
position: absolute;
right: 30px;
top: 9px;
margin-left: -2px;
cursor: pointer;
}
.subSearch{
margin: 0;
float: left;
}
#subSearchInput{
width: 100%;
float: left;
box-sizing: border-box;
-webkit-box-sizing: border-box;
padding: 5px;
padding-right: 26px;
}
#subSearchFilter{
width: 100%;
float: left;
display: none;
}
.searchResult{
width: 98%;
padding: 3px;
background-color:#123456;
}
.imgContainer{
display: inline-block;
padding: 3px;
margin: 3px;
text-align: center;
overflow: hidden;
font-size: small;
font-family: Verdana,Arial,Helvetica,sans-serif;
vertical-align: top;
}
.filterContainer{
float: left;
margin: 2px;
padding: 2px;
font-size: 14px;
}
.filterSelect{
border-style:none;
-webkit-border-top-right-radius: 15px;
-webkit-border-bottom-right-radius: 15px;
-moz-border-radius-topright: 15px;
-moz-border-radius-bottomright: 15px;
border-top-right-radius: 15px;
margin-top: 2px;
width: 100%;
}
span{
font-family: Verdana,Arial,Helvetica,sans-serif;
color: #666;
}
[draggable] {
-webkit-user-select: none;
user-select: none;
}
.toggleFilters{
margin: 0;
padding: 0;
background-position: center;
background-image: url(../images/down.png);
position: absolute;
top: 11px;
right: 6px;
width: 20px;
height: 20px;
cursor: pointer;
}
.colors_line {
float: left;
margin: 4px;
margin-right: 0;
clear: left;
}
.custom {
opacity: 0;
position: absolute;
left: -10000px;
}
.filter_button.button.color {
display: inline-block;
width: 15px;
height: 15px;
border: 1px solid #EBEBEB;
padding: 0;
margin: 0;
box-sizing: border-box;
-webkit-box-sizing: border-box;
}
.filter_button.button.color:hover {
border: 1px solid rgb(128,128,128);
cursor: pointer;
}
input[type="radio"]:checked + .filter_button.button.color {
border: 1px solid rgb(255,255,255);
box-shadow: 0 0 0px 1px #000;
-webkit-box-shadow: 0 0 0px 1px #000;
}
#allcolor {
background: white url('../images/search_app.png') -43px -144px no-repeat;
}
#colored {
background: white url('../images/search_app.png') -43px -244px no-repeat;
}
#grayed {
background: white url('../images/search_app.png') -45px -343px no-repeat;
}
#black{
background-color:#ffffff;
}
#blue{
background-color:#0000FF;
}
#brown{
background-color:rgba(139, 82, 16, 1);
}
#gray{
background-color:#999999;
}
#green{
background-color:#00CC00;
}
#orange{
background-color:#FB940B;
}
#pink{
background-color:#FF98BF;
}
#purple{
background-color:#762CA7;
}
#red{
background-color:#CC0000;
}
#teal{
background-color:#03C0C6;
}
#white{
background-color:#000000;
}
#yellow{
background-color:#FFFF00;
}
.selectBox-dropdown, .selectBox-options li a {
line-height: 1.3 !important;
font-size: 13px;
}
.pager_button {
padding: 3px 5px;
font-size: 16px;
color: black;
display: inline-block;
}
.pager_button.active {
border-radius: 3px;
-webkit-border-radius: 3px;
background-color: gray;
color: white;
}
html, body{
width: 100%;
padding: 0;
height: auto;
background-color: white;
margin: 0;
}
::-webkit-scrollbar {
width: 14px;
background-color:white;
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
background-color:lightgray;
border: 2px solid gray;
}
::-webkit-scrollbar-button:vertical:start{
border-radius: 10px;
background-color:lightgray;
background-image: url(../images/trgUp.png);
background-size: 8px auto;
background-position: center;
background-repeat: no-repeat;
border: 2px solid gray;
}
::-webkit-scrollbar-button:vertical:end{
border-radius: 10px;
background-color:lightgray;
background-image: url(../images/trgDown.png);
background-size: 8px auto;
background-position: center;
background-repeat: no-repeat;
border: 2px solid gray;
}
a {
text-decoration: underline;
}
#disc_nav_cont{
height: auto;
position: fixed;
left: 0;
bottom: 0;
width: 100%;
}
.disclaimer{
padding: 5px;
text-align: center;
background-color: #BBBBBB;
border-top: solid 4px #EEEEEE;
border-bottom: none;
font-size: 12px;
}
.resultFooter{
width: 100%;
padding: 3px;
font-family: Verdana,Arial,Helvetica,sans-serif;
font-weight: bold;
font-size: x-large;
text-align: center;
background-color: white;
}
#searchResult {
overflow: hidden;
text-align: center;
margin-top: 50px;
margin-bottom: 50px;
}
.search{
position: fixed;
top: 0;
left: 0;
padding: 5px;
background-color: #BBBBBB;
border-bottom: solid 4px #EEEEEE;
}
.search,
.disclaimer {
width: 100%;
box-sizing: border-box;
-webkit-box-sizing: border-box;
}
.searchInput{
padding: 3px;
float: left;
width: 100%;
border-radius: 3px;
border-style: none;
height: 22px;
line-height: 18px;
vertical-align: middle;
box-sizing: border-box;
-webkit-box-sizing: border-box;
}
.searchButton{
background: url("../images/search_app.png") -38px -38px no-repeat;
width: 24px;
height: 24px;
overflow: hidden;
position: absolute;
right: 30px;
top: 9px;
margin-left: -2px;
cursor: pointer;
}
.subSearch{
margin: 0;
float: left;
}
#subSearchInput{
width: 100%;
float: left;
box-sizing: border-box;
-webkit-box-sizing: border-box;
padding: 5px;
padding-right: 26px;
}
#subSearchFilter{
width: 100%;
float: left;
display: none;
}
.searchResult{
width: 98%;
padding: 3px;
background-color:#123456;
}
.imgContainer{
display: inline-block;
padding: 3px;
margin: 3px;
text-align: center;
overflow: hidden;
font-size: small;
font-family: Verdana,Arial,Helvetica,sans-serif;
vertical-align: top;
}
.imgContainer img{
max-width: 150px;
max-height:150px;
}
.filterContainer{
float: left;
margin: 2px;
padding: 2px;
font-size: 14px;
}
.filterSelect{
border-style:none;
-webkit-border-top-right-radius: 15px;
-webkit-border-bottom-right-radius: 15px;
-moz-border-radius-topright: 15px;
-moz-border-radius-bottomright: 15px;
border-top-right-radius: 15px;
margin-top: 2px;
width: 100%;
}
span{
font-family: Verdana,Arial,Helvetica,sans-serif;
color: #666;
}
[draggable] {
-webkit-user-select: none;
user-select: none;
}
.toggleFilters{
margin: 0;
padding: 0;
background-position: center;
background-image: url(../images/down.png);
position: absolute;
top: 11px;
right: 6px;
width: 20px;
height: 20px;
cursor: pointer;
}
.colors_line {
float: left;
margin: 4px;
margin-right: 0;
clear: left;
}
.custom {
opacity: 0;
position: absolute;
left: -10000px;
}
.filter_button.button.color {
display: inline-block;
width: 15px;
height: 15px;
border: 1px solid #EBEBEB;
padding: 0;
margin: 0;
box-sizing: border-box;
-webkit-box-sizing: border-box;
}
.filter_button.button.color:hover {
border: 1px solid rgb(128,128,128);
cursor: pointer;
}
input[type="radio"]:checked + .filter_button.button.color {
border: 1px solid rgb(255,255,255);
box-shadow: 0 0 0px 1px #000;
-webkit-box-shadow: 0 0 0px 1px #000;
}
#allcolor {
background: white url('../images/search_app.png') -43px -144px no-repeat;
}
#colored {
background: white url('../images/search_app.png') -43px -244px no-repeat;
}
#grayed {
background: white url('../images/search_app.png') -45px -343px no-repeat;
}
#black{
background-color:#ffffff;
}
#blue{
background-color:#0000FF;
}
#brown{
background-color:rgba(139, 82, 16, 1);
}
#gray{
background-color:#999999;
}
#green{
background-color:#00CC00;
}
#orange{
background-color:#FB940B;
}
#pink{
background-color:#FF98BF;
}
#purple{
background-color:#762CA7;
}
#red{
background-color:#CC0000;
}
#teal{
background-color:#03C0C6;
}
#white{
background-color:#000000;
}
#yellow{
background-color:#FFFF00;
}
.selectBox-dropdown, .selectBox-options li a {
line-height: 1.3 !important;
font-size: 13px;
}
.pager_button {
padding: 3px 5px;
font-size: 16px;
color: black;
display: inline-block;
}
.pager_button.active {
border-radius: 3px;
-webkit-border-radius: 3px;
background-color: gray;
color: white;
}
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
File mode changed from 100644 to 100755
<!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"/>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Planete Sankore Image Search</title>
<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">
var category = "image";
var thumbnails = true;
var minHeight = 180;
var minWidth = 150;
var currentIndex = 0;
var currentTerm = "";
var limit = 10;
var filtersDisplayed = false; //display or hide filters
function addPaginationLinks(totalResults) {
var curPage = currentIndex; // check what page the app is on
var pagesDiv = $("<div id='resultFooter' class='resultFooter'>");
for (var i = 0; i < 8; i++) {
if (i * limit < totalResults) {
var link = $("<a class='pager_button'></a>").attr('href', 'javascript:gotoPage('+i+');').html(i+1).appendTo(pagesDiv);
if (curPage == i) {
link.addClass('active');
}
}
}
$("#disc_nav_cont #resultFooter").remove();
pagesDiv.insertBefore($('#disclaimer'));
$(".imgContainer").each(function(){
this.addEventListener("dragstart", imageDragging, false);
})
$(".imgContainer").each(function(){
this.addEventListener("dragenter", imageDragenter, false);
})
$(".imgContainer").each(function(){
this.addEventListener("dragleave", imageDragleave, false);
})
$(".imgContainer").each(function(){
this.addEventListener("dragover", imageDragover, false);
})
}
function searchFail(jqXHR, textStatus, errorThrown) {
alert('Impossible to connect to Planete Sankore: ' + textStatus + ' ' + errorThrown);
}
function searchComplete(json) {
// Grab our content div, clear it.
var totalResults = json.totalResults;
var contentDiv = $('#searchResult').empty();
// Loop through our results, printing them to the page.
var results = json.rows;
for (var i = 0; i < results.length; i++) {
// For each result write it's title and image to the screen
var result = results[i];
var imgContainer = $("<div class='imgContainer' draggable='true'>");
//var title = document.createElement('div');
var iUrl = $("<input type='hidden'/>");
var iContent = $("<input type='hidden'/>");
var iHeight = $("<input type='hidden'/>");
var iWidth = $("<input type='hidden'/>");
var iTitle = $("<input type='hidden'/>");
// We use titleNoFormatting so that no HTML tags are left in the
// title
//title.innerHTML = result.title;
var newImg = document.createElement('img');
// There is also a result.file property which has the escaped version
if (thumbnails) {
newImg.src = result.file;
if(result.height >= result.width)
newImg.height = minHeight;
else{
newImg.width = minWidth;
//newImg.style.margin = (120 - result.height)/2 + "px 0";
}
} else {
newImg.src = "./images/thumbnail_icon.png";
}
var imgWidth = (result.tbWidth > minWidth)?result.tbWidth:minWidth;
var imgHeight = (result.tbHeight > minHeight)?result.tbHeight:minHeight;
imgContainer.width(imgWidth).height(imgHeight);
imgContainer.append($(newImg));
iUrl.attr("value", result.file);
iContent.attr("value", result.title);
iHeight.attr("value", result.height);
iWidth.attr("value", result.width);
iTitle.attr("value",result.title);
//imgContainer.append($(title));
imgContainer.append(iUrl);
imgContainer.append(iContent);
imgContainer.append(iHeight);
imgContainer.append(iWidth);
imgContainer.append(iTitle);
// Put our title + image in the content
imgContainer.appendTo(contentDiv);
}
// Now add links to additional pages of search results.
addPaginationLinks(totalResults);
}
function imageDragging(e){
e.dataTransfer.setData("text/plain",$(this).find("input:hidden").eq(0).val());
// alert($(this).find("input:hidden").eq(0).val());
}
function imageDragleave(e){
return false;
}
function imageDragover(e){
return false;
}
function imageDragenter(e){
return false;
}
$(document).ready(function(){
//variables
var mode = false; //search or view mode
var hide = false; //hide or no main panel
//basic containers and elements
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 search = $("<div id='search' class='search'>").appendTo("body");
var togglePages = $("<div id='togglePages' class='togglePages'>").appendTo(search);
var toggleIcon = $("<div id='toggleIcon' class='toggleIcon'>").appendTo(togglePages);
var subSearchInput = $("<div id='subSearchInput' 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 searchButton = $("<div id='searchButton' class='searchButton'>").appendTo(subSearchInput);
// var toggleFilters = $("<div id='toggleFilters' class='toggleFilters'>").appendTo(subSearchInput);
//adding filters to the wgt
var selectFilter = $("<select id='sizeFilter' class='filterSelect'>")
.append($("<option value='0'>Any</option>"))
.append($("<option value='1'>Small</option>"))
.append($("<option value='2'>Medium</option>"))
.append($("<option value='3'>Large</option>"))
.append($("<option value='4'>Extra large</option>"));
$("<div class='filterContainer'>").append("<span>Size:</span>").append(selectFilter).appendTo(subSearchFilter);
//mouse click actions
/*
toggleFilters.click(function(){
if(filtersDisplayed){
subSearchFilter.hide();
toggleFilters.css("background-image","url(images/down.png)");
filtersDisplayed = false;
} else {
subSearchFilter.show();
toggleFilters.css("background-image","url(images/up.png)");
filtersDisplayed = true;
}
});
*/
/*togglePages.click(function(event){
if(mode){
hide = false;
$("#search, #disclaimer").slideDown('slow', function(){
toggleIcon.css("background-image","url(images/trgUp.png)");
togglePages.appendTo("#search").css("top","").css("bottom","-14px");
});
mode = false;
} else {
hide = true;
$("#search, #disclaimer").slideUp('slow', function(){
toggleIcon.css("background-image","url(images/trgDown.png)");
togglePages.appendTo("body").css("top","0");
});
mode = true;
}
});*/
searchButton.click(function(){
if(!hide){
runSearch(searchInput.val(), 0);
//togglePages.trigger("click");
}
});
searchInput.keydown(function(event){
if(!hide){
if((event.keyCode == 0xA)||(event.keyCode == 0xD)){
runSearch(searchInput.val(), 0);
//togglePages.trigger("click");
}
}
});
(
$(".imgContainer").live("click",function(){
sankore.sendFileMetadata(createMetaData($(this)));
}));
/*$(window).resize(function(){
disclaimer.width($("body").width()-20);
search.width($("body").width()-20);
toggleIcon.css("margin-left",(togglePages.width()/2 - 7));
})*/
});
function gotoPage(i) {
runSearch(currentTerm, i);
}
// launching the search on planete sankore
function runSearch(term, index) {
currentTerm = term;
currentIndex = index;
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;
$.ajax({
url: url,
success: searchComplete,
error: searchFail,
dataType: "json"
});
}
function createMetaData(parent){
var meta = "";
//alert($(this).find("input:hidden").eq(0).val());
meta = "<metadata><data><key>Type</key><value>Image</value></data><data><key>Url</key><value>" +
parent.find("input:hidden").eq(0).val() +
"</value></data><data><key>Content</key><value>" +
parent.find("input:hidden").eq(1).val() +
"</value></data><data><key>Height</key><value>" +
parent.find("input:hidden").eq(2).val() +
"</value></data><data><key>Width</key><value>" +
parent.find("input:hidden").eq(3).val() +
"</value></data><data><key>Title</key><value>" +
parent.find("input:hidden").eq(4).val() +
"</value></data></metadata>";
return meta;
}
</script>
</head>
<body style="font-family: Arial;border: 0 none;">
<div id="searchResult"></div>
</body>
</html>
<!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"/>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Planete Sankore Image Search</title>
<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">
var category = "image";
var thumbnails = true;
var minHeight = 150;
var minWidth = 150;
var currentIndex = 0;
var currentTerm = "";
var limit = 10;
var filtersDisplayed = false; //display or hide filters
function addPaginationLinks(totalResults) {
var curPage = currentIndex; // check what page the app is on
var pagesDiv = $("<div id='resultFooter' class='resultFooter'>");
for (var i = 0; i < 8; i++) {
if (i * limit < totalResults) {
var link = $("<a class='pager_button'></a>").attr('href', 'javascript:gotoPage('+i+');').html(i+1).appendTo(pagesDiv);
if (curPage == i) {
link.addClass('active');
}
}
}
$("#disc_nav_cont #resultFooter").remove();
pagesDiv.insertBefore($('#disclaimer'));
$(".imgContainer").each(function(){
this.addEventListener("dragstart", imageDragging, false);
})
$(".imgContainer").each(function(){
this.addEventListener("dragenter", imageDragenter, false);
})
$(".imgContainer").each(function(){
this.addEventListener("dragleave", imageDragleave, false);
})
$(".imgContainer").each(function(){
this.addEventListener("dragover", imageDragover, false);
})
}
function searchFail(jqXHR, textStatus, errorThrown) {
alert('Impossible to connect to Planete Sankore: ' + textStatus + ' ' + errorThrown);
}
function searchComplete(json) {
// Grab our content div, clear it.
var totalResults = json.totalResults;
var contentDiv = $('#searchResult').empty();
// Loop through our results, printing them to the page.
var results = json.rows;
for (var i = 0; i < results.length; i++) {
// For each result write it's title and image to the screen
var result = results[i];
var imgContainer = $("<div class='imgContainer' draggable='true'>");
//var title = document.createElement('div');
var iUrl = $("<input type='hidden'/>");
var iContent = $("<input type='hidden'/>");
var iHeight = $("<input type='hidden'/>");
var iWidth = $("<input type='hidden'/>");
var iTitle = $("<input type='hidden'/>");
// We use titleNoFormatting so that no HTML tags are left in the
// title
//title.innerHTML = result.title;
var newImg = document.createElement('img');
// There is also a result.file property which has the escaped version
if (thumbnails) {
newImg.src = result.file;
/*if(result.height >= result.width)
newImg.height = minHeight;
else{
newImg.width = minWidth;
//newImg.style.margin = (120 - result.height)/2 + "px 0";
}*/
} else {
newImg.src = "./images/thumbnail_icon.png";
}
var imgWidth = (result.tbWidth > minWidth)?result.tbWidth:minWidth;
var imgHeight = (result.tbHeight > minHeight)?result.tbHeight:minHeight;
imgContainer.width(imgWidth).height(imgHeight);
imgContainer.append($(newImg));
iUrl.attr("value", result.file);
iContent.attr("value", result.title);
iHeight.attr("value", result.height);
iWidth.attr("value", result.width);
iTitle.attr("value",result.title);
//imgContainer.append($(title));
imgContainer.append(iUrl);
imgContainer.append(iContent);
imgContainer.append(iHeight);
imgContainer.append(iWidth);
imgContainer.append(iTitle);
// Put our title + image in the content
imgContainer.appendTo(contentDiv);
}
// Now add links to additional pages of search results.
addPaginationLinks(totalResults);
}
function imageDragging(e){
e.dataTransfer.setData("text/plain",$(this).find("input:hidden").eq(0).val());
// alert($(this).find("input:hidden").eq(0).val());
}
function imageDragleave(e){
return false;
}
function imageDragover(e){
return false;
}
function imageDragenter(e){
return false;
}
$(document).ready(function(){
//variables
var mode = false; //search or view mode
var hide = false; //hide or no main panel
//basic containers and elements
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 search = $("<div id='search' class='search'>").appendTo("body");
var togglePages = $("<div id='togglePages' class='togglePages'>").appendTo(search);
var toggleIcon = $("<div id='toggleIcon' class='toggleIcon'>").appendTo(togglePages);
var subSearchInput = $("<div id='subSearchInput' 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 searchButton = $("<div id='searchButton' class='searchButton'>").appendTo(subSearchInput);
// var toggleFilters = $("<div id='toggleFilters' class='toggleFilters'>").appendTo(subSearchInput);
//adding filters to the wgt
var selectFilter = $("<select id='sizeFilter' class='filterSelect'>")
.append($("<option value='0'>Any</option>"))
.append($("<option value='1'>Small</option>"))
.append($("<option value='2'>Medium</option>"))
.append($("<option value='3'>Large</option>"))
.append($("<option value='4'>Extra large</option>"));
$("<div class='filterContainer'>").append("<span>Size:</span>").append(selectFilter).appendTo(subSearchFilter);
//mouse click actions
/*
toggleFilters.click(function(){
if(filtersDisplayed){
subSearchFilter.hide();
toggleFilters.css("background-image","url(images/down.png)");
filtersDisplayed = false;
} else {
subSearchFilter.show();
toggleFilters.css("background-image","url(images/up.png)");
filtersDisplayed = true;
}
});
*/
/*togglePages.click(function(event){
if(mode){
hide = false;
$("#search, #disclaimer").slideDown('slow', function(){
toggleIcon.css("background-image","url(images/trgUp.png)");
togglePages.appendTo("#search").css("top","").css("bottom","-14px");
});
mode = false;
} else {
hide = true;
$("#search, #disclaimer").slideUp('slow', function(){
toggleIcon.css("background-image","url(images/trgDown.png)");
togglePages.appendTo("body").css("top","0");
});
mode = true;
}
});*/
searchButton.click(function(){
if(!hide){
runSearch(searchInput.val(), 0);
//togglePages.trigger("click");
}
});
searchInput.keydown(function(event){
if(!hide){
if((event.keyCode == 0xA)||(event.keyCode == 0xD)){
runSearch(searchInput.val(), 0);
//togglePages.trigger("click");
}
}
});
(
$(".imgContainer").live("click",function(){
sankore.sendFileMetadata(createMetaData($(this)));
}));
/*$(window).resize(function(){
disclaimer.width($("body").width()-20);
search.width($("body").width()-20);
toggleIcon.css("margin-left",(togglePages.width()/2 - 7));
})*/
});
function gotoPage(i) {
runSearch(currentTerm, i);
}
// launching the search on planete sankore
function runSearch(term, index) {
currentTerm = term;
currentIndex = index;
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;
$.ajax({
url: url,
success: searchComplete,
error: searchFail,
dataType: "json"
});
}
function createMetaData(parent){
var meta = "";
//alert($(this).find("input:hidden").eq(0).val());
meta = "<metadata><data><key>Type</key><value>Image</value></data><data><key>Url</key><value>" +
parent.find("input:hidden").eq(0).val() +
"</value></data><data><key>Content</key><value>" +
parent.find("input:hidden").eq(1).val() +
"</value></data><data><key>Height</key><value>" +
parent.find("input:hidden").eq(2).val() +
"</value></data><data><key>Width</key><value>" +
parent.find("input:hidden").eq(3).val() +
"</value></data><data><key>Title</key><value>" +
parent.find("input:hidden").eq(4).val() +
"</value></data></metadata>";
return meta;
}
</script>
</head>
<body style="font-family: Arial;border: 0 none;">
<div id="searchResult"></div>
</body>
</html>
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -70,6 +70,16 @@ QLabel#UBTGMediaDropMeLabel
padding: 2px;
}
QComboBox#DockPaletteWidgetComboBox QAbstractItemView
{
background-color: white;
color: black;
selection-background-color: lightgreen;
selection-color: black;
}
QComboBox#DockPaletteWidgetComboBox
{
background: white;
......
......@@ -31,7 +31,7 @@
#include "domain/UBGraphicsWidgetItem.h"
#include "domain/UBGraphicsTextItem.h"
#include "domain/UBGraphicsTextItemDelegate.h"
#include "domain/UBW3CWidget.h"
#include "domain/UBGraphicsWidgetItem.h"
#include "frameworks/UBFileSystemUtils.h"
......@@ -776,7 +776,7 @@ bool UBCFFSubsetAdaptor::UBCFFSubsetReader::parseSvgFlash(const QDomElement &ele
return false;
}
QString flashUrl = UBW3CWidget::createNPAPIWrapperInDir(flashPath, tmpFlashDir, "application/x-shockwave-flash"
QString flashUrl = UBGraphicsW3CWidgetItem::createNPAPIWrapperInDir(flashPath, tmpFlashDir, "application/x-shockwave-flash"
,QSize(mCurrentSceneRect.width(), mCurrentSceneRect.height()));
UBGraphicsWidgetItem *flashItem = mCurrentScene->addW3CWidget(QUrl::fromLocalFile(flashUrl));
flashItem->setSourceUrl(urlPath);
......@@ -1049,10 +1049,6 @@ void UBCFFSubsetAdaptor::UBCFFSubsetReader::repositionSvgItem(QGraphicsItem *ite
QTransform rTransform;
QPointF newVector = rTransform.map(oldVector);
QRectF sr = mCurrentScene->sceneRect();
QRectF sr1 = mCurrentSceneRect;
QRectF sr2 = mCurrentScene->normalizedSceneRect();
QTransform tr = item->sceneTransform();
item->setTransform(rTransform.scale(fullScaleX, fullScaleY), true);
tr = item->sceneTransform();
......
......@@ -27,7 +27,6 @@
#include "domain/UBGraphicsPDFItem.h"
#include "domain/UBGraphicsTextItem.h"
#include "domain/UBGraphicsTextItemDelegate.h"
#include "domain/UBAbstractWidget.h"
#include "domain/UBGraphicsStroke.h"
#include "domain/UBGraphicsStrokesGroup.h"
#include "domain/UBGraphicsGroupContainerItem.h"
......@@ -2488,7 +2487,7 @@ void UBSvgSubsetAdaptor::UBSvgSubsetWriter::graphicsW3CWidgetToSvg(UBGraphicsW3C
void UBSvgSubsetAdaptor::UBSvgSubsetWriter::graphicsWidgetToSvg(UBGraphicsWidgetItem* item)
{
QUrl widgetRootUrl = item->widgetWebView()->widgetUrl();
QUrl widgetRootUrl = item->widgetUrl();
QString uuid = UBStringUtils::toCanonicalUuid(item->uuid());
QString widgetDirectoryPath = UBPersistenceManager::widgetDirectory;
if (widgetRootUrl.toString().startsWith("file://"))
......@@ -2517,13 +2516,13 @@ void UBSvgSubsetAdaptor::UBSvgSubsetWriter::graphicsWidgetToSvg(UBGraphicsWidget
graphicsItemToSvg(item);
if (item->widgetWebView()->isFrozen())
if (item->isFrozen())
{
mXmlWriter.writeAttribute(UBSettings::uniboardDocumentNamespaceUri, "frozen", xmlTrue);
}
QString snapshotPath = mDocumentPath + "/" + UBPersistenceManager::widgetDirectory + "/" + uuid + ".png";
item->widgetWebView()->takeSnapshot().save(snapshotPath, "PNG");
item->takeSnapshot().save(snapshotPath, "PNG");
mXmlWriter.writeStartElement(nsXHtml, "iframe");
......@@ -2532,10 +2531,10 @@ void UBSvgSubsetAdaptor::UBSvgSubsetWriter::graphicsWidgetToSvg(UBGraphicsWidget
mXmlWriter.writeAttribute("height", QString("%1").arg(item->boundingRect().height()));
QString startFileUrl;
if (item->widgetWebView()->mainHtmlFileName().startsWith("http://"))
startFileUrl = item->widgetWebView()->mainHtmlFileName();
if (item->mainHtmlFileName().startsWith("http://"))
startFileUrl = item->mainHtmlFileName();
else
startFileUrl = widgetRootUrl.toString() + "/" + item->widgetWebView()->mainHtmlFileName();
startFileUrl = widgetRootUrl.toString() + "/" + item->mainHtmlFileName();
mXmlWriter.writeAttribute("src", startFileUrl);
mXmlWriter.writeEndElement(); //iFrame
......@@ -2626,13 +2625,13 @@ UBGraphicsW3CWidgetItem* UBSvgSubsetAdaptor::UBSvgSubsetReader::graphicsW3CWidge
QPixmap snapshot(pixPath);
if (!snapshot.isNull())
widgetItem->w3cWidget()->setSnapshot(snapshot);
widgetItem->setSnapshot(snapshot);
QStringRef frozen = mXmlReader.attributes().value(mNamespaceUri, "frozen");
if (!frozen.isNull() && frozen.toString() == xmlTrue && !snapshot.isNull())
{
widgetItem->w3cWidget()->freeze();
widgetItem->freeze();
}
graphicsItemFromSvg(widgetItem);
......
......@@ -281,12 +281,12 @@ void UBDocumentPublisher::upgradeDocumentForPublishing()
jsonFile.write(QString(" \"uuid\": \"%1\",\n").arg(UBStringUtils::toCanonicalUuid(widget->uuid())).toUtf8());
jsonFile.write(QString(" \"id\": \"%1\",\n").arg(widget->metadatas().id).toUtf8());
jsonFile.write(QString(" \"name\": \"%1\",\n").arg(widget->w3cWidget()->metadatas().name).toUtf8());
jsonFile.write(QString(" \"description\": \"%1\",\n").arg(widget->w3cWidget()->metadatas().description).toUtf8());
jsonFile.write(QString(" \"author\": \"%1\",\n").arg(widget->w3cWidget()->metadatas().author).toUtf8());
jsonFile.write(QString(" \"authorEmail\": \"%1\",\n").arg(widget->w3cWidget()->metadatas().authorEmail).toUtf8());
jsonFile.write(QString(" \"authorHref\": \"%1\",\n").arg(widget->w3cWidget()->metadatas().authorHref).toUtf8());
jsonFile.write(QString(" \"version\": \"%1\",\n").arg(widget->w3cWidget()->metadatas().authorHref).toUtf8());
jsonFile.write(QString(" \"name\": \"%1\",\n").arg(widget->metadatas().name).toUtf8());
jsonFile.write(QString(" \"description\": \"%1\",\n").arg(widget->metadatas().description).toUtf8());
jsonFile.write(QString(" \"author\": \"%1\",\n").arg(widget->metadatas().author).toUtf8());
jsonFile.write(QString(" \"authorEmail\": \"%1\",\n").arg(widget->metadatas().authorEmail).toUtf8());
jsonFile.write(QString(" \"authorHref\": \"%1\",\n").arg(widget->metadatas().authorHref).toUtf8());
jsonFile.write(QString(" \"version\": \"%1\",\n").arg(widget->metadatas().authorHref).toUtf8());
jsonFile.write(QString(" \"x\": %1,\n").arg(widget->sceneBoundingRect().x()).toUtf8());
jsonFile.write(QString(" \"y\": %1,\n").arg(widget->sceneBoundingRect().y()).toUtf8());
......@@ -298,10 +298,10 @@ void UBDocumentPublisher::upgradeDocumentForPublishing()
QString url = UBPersistenceManager::widgetDirectory + "/" + widget->uuid().toString() + ".wgt";
jsonFile.write(QString(" \"src\": \"%1\",\n").arg(url).toUtf8());
QString startFile = widget->w3cWidget()->mainHtmlFileName();
QString startFile = widget->mainHtmlFileName();
jsonFile.write(QString(" \"startFile\": \"%1\",\n").arg(startFile).toUtf8());
QMap<QString, QString> preferences = widget->preferences();
QMap<QString, QString> preferences = widget->UBGraphicsWidgetItem::preferences();
jsonFile.write(QString(" \"preferences\": {\n").toUtf8());
......@@ -360,10 +360,10 @@ void UBDocumentPublisher::upgradeDocumentForPublishing()
void UBDocumentPublisher::generateWidgetPropertyScript(UBGraphicsW3CWidgetItem *widgetItem, int pageNumber)
{
QMap<QString, QString> preferences = widgetItem->preferences();
QMap<QString, QString> preferences = widgetItem->UBGraphicsWidgetItem::preferences();
QMap<QString, QString> datastoreEntries = widgetItem->datastoreEntries();
QString startFileName = widgetItem->w3cWidget()->mainHtmlFileName();
QString startFileName = widgetItem->mainHtmlFileName();
if (!startFileName.startsWith("http://"))
{
......@@ -394,18 +394,18 @@ void UBDocumentPublisher::generateWidgetPropertyScript(UBGraphicsW3CWidgetItem *
lines << " <script type=\"text/javascript\">";
lines << " var widget = {};";
lines << " widget.id = '" + widgetItem->w3cWidget()->metadatas().id + "';";
lines << " widget.name = '" + widgetItem->w3cWidget()->metadatas().name + "';";
lines << " widget.description = '" + widgetItem->w3cWidget()->metadatas().description + "';";
lines << " widget.author = '" + widgetItem->w3cWidget()->metadatas().author + "';";
lines << " widget.authorEmail = '" + widgetItem->w3cWidget()->metadatas().authorEmail + "';";
lines << " widget.authorHref = '" + widgetItem->w3cWidget()->metadatas().authorHref + "';";
lines << " widget.version = '" + widgetItem->w3cWidget()->metadatas().version + "';";
lines << " widget.id = '" + widgetItem->metadatas().id + "';";
lines << " widget.name = '" + widgetItem->metadatas().name + "';";
lines << " widget.description = '" + widgetItem->metadatas().description + "';";
lines << " widget.author = '" + widgetItem->metadatas().author + "';";
lines << " widget.authorEmail = '" + widgetItem->metadatas().authorEmail + "';";
lines << " widget.authorHref = '" + widgetItem->metadatas().authorHref + "';";
lines << " widget.version = '" + widgetItem->metadatas().version + "';";
lines << " widget.uuid = '" + UBStringUtils::toCanonicalUuid(widgetItem->uuid()) + "';";
lines << " widget.width = " + QString("%1").arg(widgetItem->w3cWidget()->width()) + ";";
lines << " widget.height = " + QString("%1").arg(widgetItem->w3cWidget()->height()) + ";";
lines << " widget.width = " + QString("%1").arg(widgetItem->nominalSize().width()) + ";";
lines << " widget.height = " + QString("%1").arg(widgetItem->nominalSize().height()) + ";";
lines << " widget.openUrl = function(url) { window.open(url); }";
lines << " widget.preferences = new Array()";
......
......@@ -30,25 +30,14 @@
#include "core/memcheck.h"
UBW3CWidgetAPI::UBW3CWidgetAPI(UBGraphicsW3CWidgetItem *graphicsWidget)
: QObject(graphicsWidget)
UBW3CWidgetAPI::UBW3CWidgetAPI(UBGraphicsW3CWidgetItem *graphicsWidget, QObject *parent)
: QObject(parent)
, mGraphicsW3CWidget(graphicsWidget)
, mW3CWidget(mGraphicsW3CWidget->w3cWidget())
{
mPreferencesAPI = new UBW3CWidgetPreferenceAPI(graphicsWidget);
mPreferencesAPI = new UBW3CWidgetPreferenceAPI(graphicsWidget, parent);
}
UBW3CWidgetAPI::UBW3CWidgetAPI(UBW3CWidget *widget)
: QObject(widget)
, mGraphicsW3CWidget(0)
, mW3CWidget(widget)
{
mPreferencesAPI = new UBW3CWidgetPreferenceAPI(widget);
}
UBW3CWidgetAPI::~UBW3CWidgetAPI()
{
// NOOP
......@@ -66,55 +55,55 @@ QString UBW3CWidgetAPI::uuid()
int UBW3CWidgetAPI::width()
{
return mW3CWidget->geometry().width();
return mGraphicsW3CWidget->nominalSize().width();
}
int UBW3CWidgetAPI::height()
{
return mW3CWidget->geometry().height();
return mGraphicsW3CWidget->nominalSize().height();
}
QString UBW3CWidgetAPI::id()
{
return mW3CWidget->metadatas().id;
return mGraphicsW3CWidget->metadatas().id;
}
QString UBW3CWidgetAPI::name()
{
return mW3CWidget->metadatas().name;
return mGraphicsW3CWidget->metadatas().name;
}
QString UBW3CWidgetAPI::description()
{
return mW3CWidget->metadatas().description;
return mGraphicsW3CWidget->metadatas().description;
}
QString UBW3CWidgetAPI::author()
{
return mW3CWidget->metadatas().author;
return mGraphicsW3CWidget->metadatas().author;
}
QString UBW3CWidgetAPI::authorEmail()
{
return mW3CWidget->metadatas().authorEmail;
return mGraphicsW3CWidget->metadatas().authorEmail;
}
QString UBW3CWidgetAPI::authorHref()
{
return mW3CWidget->metadatas().authorHref;
return mGraphicsW3CWidget->metadatas().authorHref;
}
QString UBW3CWidgetAPI::version()
{
return mW3CWidget->metadatas().version;
return mGraphicsW3CWidget->metadatas().version;
}
QObject* UBW3CWidgetAPI::preferences()
......@@ -129,24 +118,13 @@ void UBW3CWidgetAPI::openURL(const QString& url)
}
UBW3CWidgetPreferenceAPI::UBW3CWidgetPreferenceAPI(UBGraphicsW3CWidgetItem *graphicsWidget)
: UBW3CWebStorage(graphicsWidget)
UBW3CWidgetPreferenceAPI::UBW3CWidgetPreferenceAPI(UBGraphicsW3CWidgetItem *graphicsWidget, QObject *parent)
: UBW3CWebStorage(parent)
, mGraphicsW3CWidget(graphicsWidget)
, mW3CWidget(graphicsWidget->w3cWidget())
{
// NOOP
}
UBW3CWidgetPreferenceAPI::UBW3CWidgetPreferenceAPI(UBW3CWidget *widget)
: UBW3CWebStorage(widget)
, mGraphicsW3CWidget(0)
, mW3CWidget(widget)
{
// NOOP
}
UBW3CWidgetPreferenceAPI::~UBW3CWidgetPreferenceAPI()
{
// NOOP
......@@ -155,45 +133,35 @@ UBW3CWidgetPreferenceAPI::~UBW3CWidgetPreferenceAPI()
QString UBW3CWidgetPreferenceAPI::key(int index)
{
QMap<QString, UBW3CWidget::PreferenceValue> w3CPrefs = mW3CWidget->preferences();
if (index < w3CPrefs.size())
return w3CPrefs.keys().at(index);
else
return "";
QMap<QString, UBGraphicsW3CWidgetItem::PreferenceValue> w3CPrefs = mGraphicsW3CWidget->preferences();
if (index < w3CPrefs.size())
return w3CPrefs.keys().at(index);
else
return "";
}
QString UBW3CWidgetPreferenceAPI::getItem(const QString& key)
{
if (mGraphicsW3CWidget)
{
QMap<QString, QString> docPref = mGraphicsW3CWidget->preferences();
if (docPref.contains(key))
return docPref.value(key);
}
QMap<QString, UBW3CWidget::PreferenceValue> w3cPrefs = mW3CWidget->preferences();
if (mGraphicsW3CWidget) {
QMap<QString, QString> docPref = mGraphicsW3CWidget->UBGraphicsWidgetItem::preferences();
if (docPref.contains(key))
return docPref.value(key);
if (w3cPrefs.contains(key))
{
UBW3CWidget::PreferenceValue pref = w3cPrefs.value(key);
return pref.value;
}
else
{
return "";
}
QMap<QString, UBGraphicsW3CWidgetItem::PreferenceValue> w3cPrefs = mGraphicsW3CWidget->preferences();
if (w3cPrefs.contains(key)) {
UBGraphicsW3CWidgetItem::PreferenceValue pref = w3cPrefs.value(key);
return pref.value;
}
}
return QString();
}
int UBW3CWidgetPreferenceAPI::length()
{
QMap<QString, UBW3CWidget::PreferenceValue> w3cPrefs = mW3CWidget->preferences();
QMap<QString, UBGraphicsW3CWidgetItem::PreferenceValue> w3cPrefs = mGraphicsW3CWidget->preferences();
return w3cPrefs.size();
}
......@@ -201,39 +169,28 @@ int UBW3CWidgetPreferenceAPI::length()
void UBW3CWidgetPreferenceAPI::setItem(const QString& key, const QString& value)
{
if (mGraphicsW3CWidget)
{
QMap<QString, UBW3CWidget::PreferenceValue> w3cPrefs = mW3CWidget->preferences();
if (mGraphicsW3CWidget) {
QMap<QString, UBGraphicsW3CWidgetItem::PreferenceValue> w3cPrefs = mGraphicsW3CWidget->preferences();
if (w3cPrefs.contains(key) && !w3cPrefs.value(key).readonly)
mGraphicsW3CWidget->setPreference(key, value);
}
else
{
// No state for non graphics widget (aka tool widget)
}
if (w3cPrefs.contains(key) && !w3cPrefs.value(key).readonly)
mGraphicsW3CWidget->setPreference(key, value);
}
}
void UBW3CWidgetPreferenceAPI::removeItem(const QString& key)
{
if (mGraphicsW3CWidget)
mGraphicsW3CWidget->removePreference(key);
else
{
// No state for non graphics widget (aka tool widget)
}
if (mGraphicsW3CWidget)
mGraphicsW3CWidget->removePreference(key);
}
void UBW3CWidgetPreferenceAPI::clear()
{
if (mGraphicsW3CWidget)
mGraphicsW3CWidget->removeAllPreferences();
else
{
// No state for non graphics widget (aka tool widget)
}
if (mGraphicsW3CWidget)
mGraphicsW3CWidget->removeAllPreferences();
}
......
......@@ -47,8 +47,7 @@ class UBW3CWidgetAPI : public QObject
public:
UBW3CWidgetAPI(UBGraphicsW3CWidgetItem *graphicsWidget);
UBW3CWidgetAPI(UBW3CWidget *widget);
UBW3CWidgetAPI(UBGraphicsW3CWidgetItem *graphicsWidget, QObject *parent = 0);
virtual ~UBW3CWidgetAPI();
......@@ -72,7 +71,6 @@ class UBW3CWidgetAPI : public QObject
private:
UBGraphicsW3CWidgetItem* mGraphicsW3CWidget;
UBW3CWidget *mW3CWidget;
UBW3CWidgetPreferenceAPI* mPreferencesAPI;
......@@ -88,8 +86,8 @@ class UBW3CWebStorage : public QObject
public:
UBW3CWebStorage(QObject *parent = 0)
: QObject(parent){}
virtual ~UBW3CWebStorage(){}
: QObject(parent){/* NOOP */}
virtual ~UBW3CWebStorage(){/* NOOP */}
public slots:
......@@ -110,8 +108,7 @@ class UBW3CWidgetPreferenceAPI : public UBW3CWebStorage
Q_OBJECT;
public:
UBW3CWidgetPreferenceAPI(UBGraphicsW3CWidgetItem *graphicsWidget);
UBW3CWidgetPreferenceAPI(UBW3CWidget *widget);
UBW3CWidgetPreferenceAPI(UBGraphicsW3CWidgetItem *graphicsWidget, QObject *parent = 0);
virtual ~UBW3CWidgetPreferenceAPI();
......@@ -129,7 +126,6 @@ class UBW3CWidgetPreferenceAPI : public UBW3CWebStorage
private:
UBGraphicsW3CWidgetItem* mGraphicsW3CWidget;
UBW3CWidget* mW3CWidget;
};
......
......@@ -17,16 +17,15 @@
#include "core/UBApplication.h"
#include "domain/UBAbstractWidget.h"
#include "domain/UBGraphicsWebView.h"
#include "core/memcheck.h"
UBWidgetMessageAPI::UBWidgetMessageAPI(UBW3CWidget *widget)
: QObject(widget)
, mWebWidget(widget)
UBWidgetMessageAPI::UBWidgetMessageAPI(UBGraphicsWidgetItem *graphicsWidgetItem, QObject *parent)
: QObject(parent)
, mGraphicsWidgetItem(graphicsWidgetItem)
{
connect(UBWidgetAPIMessageBroker::instance(), SIGNAL(newMessage(const QString&, const QString&))
, this, SLOT(onNewMessage(const QString&, const QString&)), Qt::QueuedConnection);
connect(UBWidgetAPIMessageBroker::instance(), SIGNAL(newMessage(const QString&, const QString&)), this, SLOT(onNewMessage(const QString&, const QString&)), Qt::QueuedConnection);
}
UBWidgetMessageAPI::~UBWidgetMessageAPI()
......@@ -45,9 +44,7 @@ void UBWidgetMessageAPI::onNewMessage(const QString& pTopicName, const QString&
{
if (mSubscribedTopics.contains(pTopicName))
{
if (mWebWidget
&& mWebWidget->page()
&& mWebWidget->page()->mainFrame())
if (mGraphicsWidgetItem && mGraphicsWidgetItem->page() && mGraphicsWidgetItem->page()->mainFrame())
{
QString js;
......@@ -55,7 +52,7 @@ void UBWidgetMessageAPI::onNewMessage(const QString& pTopicName, const QString&
js += "{widget.messages.onmessage('";
js += pMessage + "', '" + pTopicName + "')}";
mWebWidget->page()->
mGraphicsWidgetItem->page()->
mainFrame()->evaluateJavaScript(js);
}
......
......@@ -25,7 +25,7 @@ class UBWidgetMessageAPI : public QObject
Q_OBJECT;
public:
UBWidgetMessageAPI(UBW3CWidget *widget);
UBWidgetMessageAPI(UBGraphicsWidgetItem *graphicsWidgetItem, QObject *parent = 0);
virtual ~UBWidgetMessageAPI();
public slots:
......@@ -49,7 +49,7 @@ class UBWidgetMessageAPI : public QObject
private:
QSet<QString> mSubscribedTopics;
UBW3CWidget *mWebWidget;
UBGraphicsWidgetItem *mGraphicsWidgetItem;
};
......
......@@ -30,7 +30,6 @@
#include "domain/UBGraphicsScene.h"
#include "domain/UBGraphicsWidgetItem.h"
#include "domain/UBAbstractWidget.h"
#include "adaptors/UBThumbnailAdaptor.h"
......@@ -79,7 +78,7 @@ UBWidgetUniboardAPI::UBWidgetUniboardAPI(UBGraphicsScene *pScene, UBGraphicsWidg
if (w3CGraphicsWidget)
{
mMessagesAPI = new UBWidgetMessageAPI(w3CGraphicsWidget->w3cWidget());
mMessagesAPI = new UBWidgetMessageAPI(w3CGraphicsWidget);
mDatastoreAPI = new UBDatastoreAPI(w3CGraphicsWidget);
}
......@@ -547,7 +546,7 @@ void UBWidgetUniboardAPI::ProcessDropEvent(QDropEvent *event)
QDropEvent readyEvent(dropPoint, dropActions, &dropMimeData, dropMouseButtons, dropModifiers);
//sending event to destination either it had been downloaded or not
QApplication::sendEvent(mGraphicsWidget->widgetWebView(),&readyEvent);
QApplication::sendEvent(mGraphicsWidget,&readyEvent);
readyEvent.acceptProposedAction();
}
......@@ -602,11 +601,11 @@ void UBWidgetUniboardAPI::onDownloadFinished(bool pSuccess, sDownloadFileDesc de
//To make js interpreter accept drop event we need to generate move event first.
QDragMoveEvent pseudoMove(dropPoint, desc.dropActions, &dropMimeData, desc.dropMouseButtons, desc.dropModifiers);
QApplication::sendEvent(mGraphicsWidget->widgetWebView(),&pseudoMove);
QApplication::sendEvent(mGraphicsWidget,&pseudoMove);
QDropEvent readyEvent(dropPoint, desc.dropActions, &dropMimeData, desc.dropMouseButtons, desc.dropModifiers);
//sending event to destination either it had been downloaded or not
QApplication::sendEvent(mGraphicsWidget->widgetWebView(),&readyEvent);
QApplication::sendEvent(mGraphicsWidget,&readyEvent);
readyEvent.acceptProposedAction();
}
......@@ -736,9 +735,9 @@ void UBDocumentDatastoreAPI::removeItem(const QString& key)
{
mGraphicsW3CWidget->removeDatastoreEntry(key);
}
void
void UBDocumentDatastoreAPI::clear()
UBDocumentDatastoreAPI::clear()
{
mGraphicsW3CWidget->removeAllDatastoreEntries();
}
......
......@@ -49,7 +49,6 @@
#include "domain/UBGraphicsWidgetItem.h"
#include "domain/UBGraphicsMediaItem.h"
#include "domain/UBGraphicsPDFItem.h"
#include "domain/UBW3CWidget.h"
#include "domain/UBGraphicsTextItem.h"
#include "domain/UBPageSizeUndoCommand.h"
#include "domain/UBGraphicsGroupContainerItem.h"
......@@ -955,12 +954,12 @@ UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QStri
if (!pSuccess)
{
UBApplication::showMessage(tr("Downloading content %1 failed").arg(sourceUrl.toString()));
showMessage(tr("Downloading content %1 failed").arg(sourceUrl.toString()));
return NULL;
}
if (!sourceUrl.toString().startsWith("file://") && !sourceUrl.toString().startsWith("uniboardTool://"))
UBApplication::showMessage(tr("Download finished"));
showMessage(tr("Download finished"));
if (UBMimeType::RasterImage == itemMimeType)
{
......@@ -1151,7 +1150,7 @@ UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QStri
else
size = mActiveScene->nominalSize() * .8;
QString widgetUrl = UBW3CWidget::createNPAPIWrapper(sUrl, mimeType, size);
QString widgetUrl = UBGraphicsW3CWidgetItem::createNPAPIWrapper(sUrl, mimeType, size);
if (widgetUrl.length() > 0)
{
......@@ -1238,7 +1237,7 @@ UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QStri
}
else
{
UBApplication::showMessage(tr("Unknown tool type %1").arg(sourceUrl.toString()));
showMessage(tr("Unknown tool type %1").arg(sourceUrl.toString()));
}
}
else if (sourceUrl.toString().contains("edumedia-sciences.com"))
......@@ -1274,7 +1273,7 @@ UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QStri
else
size = mActiveScene->nominalSize() * .8;
QString widgetUrl = UBW3CWidget::createNPAPIWrapper(swfFile, "application/x-shockwave-flash", size);
QString widgetUrl = UBGraphicsW3CWidgetItem::createNPAPIWrapper(swfFile, "application/x-shockwave-flash", size);
if (widgetUrl.length() > 0)
{
......@@ -1293,7 +1292,7 @@ UBItem *UBBoardController::downloadFinished(bool pSuccess, QUrl sourceUrl, QStri
}
else
{
UBApplication::showMessage(tr("Unknown content type %1").arg(pContentTypeHeader));
showMessage(tr("Unknown content type %1").arg(pContentTypeHeader));
qWarning() << "ignoring mime type" << pContentTypeHeader ;
}
......@@ -1485,8 +1484,12 @@ void UBBoardController::boardViewResized(QResizeEvent* event)
mControlView->centerOn(0,0);
if (mDisplayView)
mDisplayView->centerOn(0,0);
mPaletteManager->containerResized();
UBApplication::boardController->controlView()->scene()->moveMagnifier();
}
......@@ -1655,52 +1658,15 @@ qreal UBBoardController::currentZoom()
return 1.0;
}
UBToolWidget* UBBoardController::addTool(const QUrl& toolUrl)
{
return addTool(toolUrl, mControlView->mapToScene(mControlView->rect().center()));
}
UBToolWidget* UBBoardController::addTool(const QUrl& toolUrl, QPointF scenePos)
{
UBToolWidget *toolWidget = new UBToolWidget(toolUrl, mMainWindow); // Deleted in UBBoardController::removeTool
QPoint pos = mControlView->mapToGlobal(mControlView->mapFromScene(scenePos));
pos -= QPoint(toolWidget->width() / 2, toolWidget->height() / 2);
toolWidget->move(pos);
mTools.append(toolWidget);
toolWidget->show();
return toolWidget;
}
void UBBoardController::removeTool(UBToolWidget* toolWidget)
{
toolWidget->hide();
mTools.removeAll(toolWidget);
delete toolWidget;
}
void UBBoardController::hide()
{
UBApplication::mainWindow->actionLibrary->setChecked(false);
controlViewHidden();
}
void UBBoardController::show()
{
UBApplication::mainWindow->actionLibrary->setChecked(false);
controlViewShown();
}
......@@ -1925,25 +1891,6 @@ void UBBoardController::grabScene(const QRectF& pSceneRect)
}
}
void UBBoardController::controlViewHidden()
{
foreach(UBToolWidget* tool, mTools)
{
tool->hide();
}
}
void UBBoardController::controlViewShown()
{
foreach(UBToolWidget* tool, mTools)
{
tool->show();
}
}
UBGraphicsMediaItem* UBBoardController::addVideo(const QUrl& pSourceUrl, bool startPlay, const QPointF& pos)
{
QUuid uuid = QUuid::createUuid();
......@@ -2003,7 +1950,7 @@ UBGraphicsWidgetItem *UBBoardController::addW3cWidget(const QUrl &pUrl, const QP
w3cWidgetItem->setSnapshotPath(QUrl::fromLocalFile(snapshotPath));
UBGraphicsWidgetItem *tmpItem = dynamic_cast<UBGraphicsWidgetItem*>(w3cWidgetItem);
if (tmpItem)
tmpItem->widgetWebView()->takeSnapshot().save(snapshotPath, "PNG");
tmpItem->takeSnapshot().save(snapshotPath, "PNG");
}
......@@ -2208,56 +2155,23 @@ void UBBoardController::togglePodcast(bool checked)
void UBBoardController::moveGraphicsWidgetToControlView(UBGraphicsWidgetItem* graphicsWidget)
{
QPoint controlViewPos = mControlView->mapFromScene(graphicsWidget->sceneBoundingRect().center());
graphicsWidget->setSelected(false);
UBAbstractWidget *aw = graphicsWidget->widgetWebView();
graphicsWidget->setWidget(0);
graphicsWidget->remove();
UBToolWidget *toolWidget = new UBToolWidget(aw, mControlContainer);
UBToolWidget *toolWidget = new UBToolWidget(graphicsWidget);
mActiveScene->addItem(toolWidget);
qreal ssf = 1 / UBApplication::boardController->systemScaleFactor();
graphicsWidget->scene()->removeItem(graphicsWidget); // TODO UB 4.6 probably leaking the frame
toolWidget->centerOn(mControlView->mapTo(mControlContainer, controlViewPos));
toolWidget->show();
toolWidget->setScale(ssf);
toolWidget->setPos(graphicsWidget->scenePos());
}
void UBBoardController::moveToolWidgetToScene(UBToolWidget* toolWidget)
{
int xIsOdd = toolWidget->width() % 2;
int yIsOdd = toolWidget->height() % 2;
QPoint mainWindowCenter = toolWidget->mapTo(mMainWindow, QPoint(toolWidget->width(), toolWidget->height()) / 2);
UBAbstractWidget* webWidget = toolWidget->webWidget();
webWidget->setParent(0);
UBGraphicsWidgetItem* graphicsWidget = 0;
UBW3CWidget* w3cWidget = qobject_cast<UBW3CWidget*>(webWidget);
if (w3cWidget)
{
graphicsWidget = new UBGraphicsW3CWidgetItem(w3cWidget);
}
else
{
UBAppleWidget* appleWidget = qobject_cast<UBAppleWidget*>(webWidget);
if (appleWidget)
{
graphicsWidget = new UBGraphicsAppleWidgetItem(appleWidget);
}
}
QPoint controlViewCenter = mControlView->mapFrom(mMainWindow, mainWindowCenter);
QPointF scenePos = mControlView->mapToScene(controlViewCenter) + QPointF(xIsOdd * 0.5, yIsOdd * 0.5);
mActiveScene->addGraphicsWidget(graphicsWidget, scenePos);
toolWidget->hide();
toolWidget->deleteLater();
UBGraphicsWidgetItem *graphicsWidgetItem = addW3cWidget(toolWidget->graphicsWidgetItem()->widgetUrl(), QPointF(0, 0));
graphicsWidgetItem->setPos(toolWidget->pos());
toolWidget->remove();
graphicsWidgetItem->setSelected(true);
}
......@@ -2343,8 +2257,8 @@ void UBBoardController::freezeW3CWidget(QGraphicsItem *item, bool freeze)
return;
if (freeze) {
item_casted->widgetWebView()->load(QUrl(item_casted->w3cWidget()->freezedWidgetFilePath()));
}else
item_casted->widgetWebView()->loadMainHtml();
item_casted->load(QUrl(UBGraphicsW3CWidgetItem::freezedWidgetFilePath()));
} else
item_casted->loadMainHtml();
}
}
......@@ -193,21 +193,16 @@ class UBBoardController : public UBDocumentContainer
UBItem *downloadFinished(bool pSuccess, QUrl sourceUrl, QString pHeader, QByteArray pData, QPointF pPos, QSize pSize, bool isBackground = false);
void changeBackground(bool isDark, bool isCrossed);
void setToolCursor(int tool);
void showMessage(const QString& message, bool showSpinningWheel);
void showMessage(const QString& message, bool showSpinningWheel = false);
void hideMessage();
void setDisabled(bool disable);
void setColorIndex(int pColorIndex);
UBToolWidget* addTool(const QUrl& toolUrl, QPointF scenePos);
UBToolWidget* addTool(const QUrl& toolUrl);
void removeTool(UBToolWidget* toolWidget);
void hide();
void show();
void setWidePageSize(bool checked);
void setRegularPageSize(bool checked);
void stylusToolChanged(int tool);
void grabScene(const QRectF& pSceneRect);
void controlViewHidden();
void controlViewShown();
UBGraphicsMediaItem* addVideo(const QUrl& pUrl, bool startPlay, const QPointF& pos);
UBGraphicsMediaItem* addAudio(const QUrl& pUrl, bool startPlay, const QPointF& pos);
UBGraphicsWidgetItem *addW3cWidget(const QUrl& pUrl, const QPointF& pos);
......@@ -277,7 +272,6 @@ class UBBoardController : public UBDocumentContainer
QColor mPenColorOnLightBackground;
QColor mMarkerColorOnDarkBackground;
QColor mMarkerColorOnLightBackground;
QList<UBToolWidget*> mTools;
qreal mSystemScaleFactor;
bool mCleanupDone;
QMap<QAction*, QPair<QString, QString> > mActionTexts;
......
......@@ -48,7 +48,6 @@
#include "network/UBServerXMLHttpRequest.h"
#include "domain/UBGraphicsScene.h"
#include "domain/UBAbstractWidget.h"
#include "domain/UBGraphicsPixmapItem.h"
#include "document/UBDocumentProxy.h"
......@@ -678,8 +677,10 @@ void UBBoardPaletteManager::changeMode(eUBDockPaletteWidgetMode newMode, bool is
{
case eUBDockPaletteWidget_BOARD:
{
mLeftPalette->assignParent(UBApplication::boardController->controlContainer());
mRightPalette->assignParent(UBApplication::boardController->controlContainer());
mLeftPalette->assignParent(mContainer);
mRightPalette->assignParent(mContainer);
mRightPalette->stackUnder(mStylusPalette);
mLeftPalette->stackUnder(mStylusPalette);
if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
{
......@@ -711,6 +712,8 @@ void UBBoardPaletteManager::changeMode(eUBDockPaletteWidgetMode newMode, bool is
{
mLeftPalette->assignParent((QWidget*)UBApplication::applicationController->uninotesController()->drawingView());
mRightPalette->assignParent((QWidget*)UBApplication::applicationController->uninotesController()->drawingView());
mRightPalette->lower();
mLeftPalette->lower();
if (UBPlatformUtils::hasVirtualKeyboard() && mKeyboardPalette != NULL)
{
......
......@@ -18,8 +18,7 @@
#include <QtGui>
#include <QtWebKit>
#include "web/UBRoutedMouseEventWebView.h"
#include "gui/UBLeftPalette.h"
#include "gui/UBRightPalette.h"
#include "gui/UBPageNavigationWidget.h"
......
......@@ -71,6 +71,7 @@ UBBoardView::UBBoardView (UBBoardController* pController, QWidget* pParent)
, suspendedMousePressEvent(NULL)
, mLongPressInterval(1000)
, mIsDragInProgress(false)
, mMultipleSelectionIsEnabled(false)
{
init ();
......@@ -86,6 +87,7 @@ UBBoardView::UBBoardView (UBBoardController* pController, int pStartLayer, int p
, suspendedMousePressEvent(NULL)
, mLongPressInterval(1000)
, mIsDragInProgress(false)
, mMultipleSelectionIsEnabled(false)
{
init ();
......@@ -123,8 +125,6 @@ UBBoardView::init ()
setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOff);
setAcceptDrops (true);
setOptimizationFlag (QGraphicsView::IndirectPainting); // enable UBBoardView::drawItems filter
mTabletStylusIsPressed = false;
mMouseButtonIsPressed = false;
mPendingStylusReleaseEvent = false;
......@@ -208,6 +208,11 @@ UBBoardView::keyPressEvent (QKeyEvent *event)
mController->addScene ();
break;
}
case Qt::Key_Control:
case Qt::Key_Shift:
{
mMultipleSelectionIsEnabled = true;
}break;
}
......@@ -268,6 +273,21 @@ UBBoardView::keyPressEvent (QKeyEvent *event)
}
}
void UBBoardView::keyReleaseEvent(QKeyEvent *event)
{
// if (!event->isAccepted ())
{
if (Qt::Key_Shift == event->key()
||Qt::Key_Control == event->key())
{
mMultipleSelectionIsEnabled = false;
}
}
QGraphicsView::keyReleaseEvent(event);
}
bool
UBBoardView::event (QEvent * e)
{
......@@ -426,7 +446,10 @@ bool UBBoardView::itemShouldReceiveMousePressEvent(QGraphicsItem *item)
UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController()->stylusTool();
if ((currentTool == UBStylusTool::Play) && UBGraphicsGroupContainerItem::Type == movingItem->type())
return movingItem = NULL;
{
movingItem = NULL;
return false;
}
switch(item->type())
{
......@@ -534,11 +557,7 @@ bool UBBoardView::itemShouldBeMoved(QGraphicsItem *item)
return true;
case UBGraphicsTextItem::Type:
return !item->isSelected();
default:
false;
}
return false;
}
......@@ -579,7 +598,8 @@ void UBBoardView::handleItemMousePress(QMouseEvent *event)
if (movingItem && QGraphicsSvgItem::Type != movingItem->type()
&& UBGraphicsDelegateFrame::Type != movingItem->type())
&& UBGraphicsDelegateFrame::Type != movingItem->type()
&& !mMultipleSelectionIsEnabled)
{
foreach(QGraphicsItem *item, scene()->selectedItems())
{
......@@ -590,6 +610,9 @@ void UBBoardView::handleItemMousePress(QMouseEvent *event)
}
}
if (mMultipleSelectionIsEnabled)
return;
if (itemShouldReceiveMousePressEvent(movingItem))
QGraphicsView::mousePressEvent (event);
else
......@@ -947,6 +970,7 @@ UBBoardView::mouseReleaseEvent (QMouseEvent *event)
if (currentTool == UBStylusTool::Selector)
{
bool bReleaseIsNeed = true;
if (mWidgetMoved)
{
mWidgetMoved = false;
......@@ -960,13 +984,26 @@ UBBoardView::mouseReleaseEvent (QMouseEvent *event)
QGraphicsView::mousePressEvent(suspendedMousePressEvent); // suspendedMousePressEvent is deleted by old Qt event loop
movingItem = NULL;
delete suspendedMousePressEvent;
suspendedMousePressEvent = NULL;
suspendedMousePressEvent = NULL;
}
else
{
if ( QGraphicsSvgItem::Type != movingItem->type()
&& UBGraphicsDelegateFrame::Type != movingItem->type())
movingItem->setSelected(true);
if (QGraphicsSvgItem::Type != movingItem->type() &&
UBGraphicsDelegateFrame::Type != movingItem->type() &&
UBToolWidget::Type != movingItem->type())
{
bReleaseIsNeed = false;
if (movingItem->isSelected() && mMultipleSelectionIsEnabled)
movingItem->setSelected(false);
else
{
if (movingItem->isSelected())
bReleaseIsNeed = true;
movingItem->setSelected(true);
}
}
}
}
......@@ -974,7 +1011,10 @@ UBBoardView::mouseReleaseEvent (QMouseEvent *event)
mUBRubberBand->hide();
}
QGraphicsView::mouseReleaseEvent (event);
if (bReleaseIsNeed)
{
QGraphicsView::mouseReleaseEvent (event);
}
}
else if (currentTool == UBStylusTool::Play)
{
......@@ -992,9 +1032,8 @@ UBBoardView::mouseReleaseEvent (QMouseEvent *event)
delete suspendedMousePressEvent;
suspendedMousePressEvent = NULL;
}
QGraphicsView::mouseReleaseEvent (event);
}
QGraphicsView::mouseReleaseEvent (event);
}
else if (currentTool == UBStylusTool::Text)
{
......@@ -1182,7 +1221,7 @@ void UBBoardView::dragMoveEvent (QDragMoveEvent *event)
}
QPoint newPoint(graphicsWidget->mapFromScene(mapToScene(event->pos())).toPoint());
QDragMoveEvent newEvent(newPoint, event->dropAction(), event->mimeData(), event->mouseButtons(), event->keyboardModifiers());
QApplication::sendEvent(graphicsWidget->widgetWebView(),&newEvent);
QApplication::sendEvent(graphicsWidget,&newEvent);
} else {
mOkOnWidget = false;
event->ignore();
......
......@@ -21,7 +21,6 @@
#include "domain/UBGraphicsDelegateFrame.h"
class UBBoardController;
class UBAppleWidget;
class UBGraphicsScene;
class UBGraphicsWidgetItem;
class UBRubberBand;
......@@ -66,6 +65,7 @@ class UBBoardView : public QGraphicsView
virtual bool event (QEvent * e);
virtual void keyPressEvent(QKeyEvent *event);
virtual void keyReleaseEvent(QKeyEvent *event);
virtual void tabletEvent(QTabletEvent * event);
virtual void mouseDoubleClickEvent(QMouseEvent *event);
virtual void mousePressEvent(QMouseEvent *event);
......@@ -146,6 +146,7 @@ class UBBoardView : public QGraphicsView
QTimer mLongPressTimer;
bool mIsDragInProgress;
bool mMultipleSelectionIsEnabled;
private slots:
......
......@@ -11,7 +11,6 @@
#include "frameworks/UBPlatformUtils.h"
#include "core/UBDownloadManager.h"
#include "domain/UBAbstractWidget.h"
#include "domain/UBGraphicsScene.h"
#include "domain/UBGraphicsSvgItem.h"
#include "domain/UBGraphicsPixmapItem.h"
......@@ -24,6 +23,7 @@ const QString UBFeaturesController::virtualRootName = "root";
void UBFeaturesComputingThread::scanFS(const QUrl & currentPath, const QString & currVirtualPath, const QSet<QUrl> &pFavoriteSet)
{
Q_ASSERT(QFileInfo(currentPath.toLocalFile()).exists());
QFileInfoList fileInfoList = UBFileSystemUtils::allElementsInDirectory(currentPath.toLocalFile());
......@@ -527,7 +527,7 @@ QImage UBFeaturesController::getIcon(const QString &path, UBFeatureElementType p
if (pFType == FEATURE_FOLDER) {
return QImage(":images/libpalette/folder.svg");
} else if (pFType == FEATURE_INTERACTIVE || pFType == FEATURE_SEARCH) {
return QImage(UBAbstractWidget::iconFilePath(QUrl::fromLocalFile(path)));
return QImage(UBGraphicsWidgetItem::iconFilePath(QUrl::fromLocalFile(path)));
} else if (pFType == FEATURE_INTERNAL) {
return QImage(UBToolsManager::manager()->iconFromToolId(path));
} else if (pFType == FEATURE_AUDIO) {
......
......@@ -24,7 +24,6 @@
#include "core/UBApplicationController.h"
#include "core/UBDownloadManager.h"
#include "domain/UBAbstractWidget.h"
#include "domain/UBGraphicsScene.h"
#include "domain/UBGraphicsSvgItem.h"
#include "domain/UBGraphicsPixmapItem.h"
......@@ -325,7 +324,7 @@ QImage UBLibraryController::thumbnailForFile(UBLibElement* pElement)
return image;
}
if (pElement->type() == eUBLibElementType_InteractiveItem){
QImage image = QImage(UBAbstractWidget::iconFilePath(pElement->path()));
QImage image = QImage(UBGraphicsWidgetItem::iconFilePath(pElement->path()));
return image;
}
......@@ -780,7 +779,7 @@ UBLibElement::UBLibElement(eUBLibElementType type, const QUrl &path, const QStri
mThumbnail = QImage(":images/libpalette/folder.svg");
if (type == eUBLibElementType_InteractiveItem)
mThumbnail = QImage(UBAbstractWidget::iconFilePath(path));
mThumbnail = QImage(UBGraphicsWidgetItem::iconFilePath(path));
if (type == eUBLibElementType_Item)
mExtension = QFileInfo(path.toLocalFile()).completeSuffix();
......
......@@ -142,7 +142,8 @@ struct UBGraphicsItemType
TriangleItemType,
MagnifierItemType,
cacheItemType,
groupContainerType
groupContainerType,
ToolWidgetItemType
};
};
......
......@@ -33,6 +33,8 @@
#include "document/UBDocumentProxy.h"
#include "document/UBDocumentController.h"
#include "domain/UBGraphicsWidgetItem.h"
#include "desktop/UBDesktopPalette.h"
#include "desktop/UBDesktopAnnotationController.h"
......@@ -44,7 +46,6 @@
#include "gui/UBTeacherGuideWidget.h"
#include "domain/UBGraphicsPixmapItem.h"
#include "domain/UBW3CWidget.h"
#include "podcast/UBPodcastController.h"
......@@ -318,7 +319,7 @@ void UBApplicationController::addCapturedEmbedCode(const QString& embedCode)
int width = 300;
int height = 150;
QString widgetPath = UBW3CWidget::createHtmlWrapperInDir(embedCode, userWidgetDir,
QString widgetPath = UBGraphicsW3CWidgetItem::createHtmlWrapperInDir(embedCode, userWidgetDir,
QSize(width, height), UBStringUtils::toCanonicalUuid(QUuid::createUuid()));
if (widgetPath.length() > 0)
......
......@@ -385,7 +385,12 @@ void UBDocumentController::setupViews()
mDocumentUI->thumbnailWidget->setBackgroundBrush(UBSettings::documentViewLightColor);
mMessageWindow = new UBMessageWindow(mDocumentUI->thumbnailWidget);
#ifdef Q_WS_MACX
mMessageWindow = new UBMessageWindow(NULL);
#else
mMessageWindow = new UBMessageWindow(mDocumentUI->thumbnailWidget);
#endif
mMessageWindow->hide();
}
......@@ -623,7 +628,7 @@ void UBDocumentController::deleteSelectedItem()
toBeDeleted << proxyTi;
}
UBApplication::showMessage(tr("Emptying trash"));
showMessage(tr("Emptying trash"));
for (int i = 0; i < toBeDeleted.count(); i++)
{
......@@ -633,7 +638,7 @@ void UBDocumentController::deleteSelectedItem()
UBPersistenceManager::persistenceManager()->deleteDocument(proxyTi->proxy());
}
UBApplication::showMessage(tr("Emptied trash"));
showMessage(tr("Emptied trash"));
QApplication::restoreOverrideCursor();
mMainWindow->actionDelete->setEnabled(false);
......@@ -683,7 +688,7 @@ void UBDocumentController::deleteSelectedItem()
{
UBDocumentProxyTreeItem* proxyTi = toBeDeleted.at(i);
UBApplication::showMessage(QString("Deleting %1").arg(proxyTi->proxy()->metaData(UBSettings::documentName).toString()));
showMessage(QString("Deleting %1").arg(proxyTi->proxy()->metaData(UBSettings::documentName).toString()));
// Move document to trash
QString oldGroupName = proxyTi->proxy()->metaData(UBSettings::documentGroupName).toString();
proxyTi->proxy()->setMetaData(UBSettings::documentGroupName, UBSettings::trashedDocumentGroupNamePrefix + oldGroupName);
......@@ -693,7 +698,7 @@ void UBDocumentController::deleteSelectedItem()
mTrashTi->addChild(proxyTi);
proxyTi->setFlags(proxyTi->flags() ^ Qt::ItemIsEditable);
UBApplication::showMessage(QString("%1 deleted").arg(groupTi->groupName()));
showMessage(QString("%1 deleted").arg(groupTi->groupName()));
}
// dont remove default group
......@@ -732,7 +737,7 @@ void UBDocumentController::exportDocument()
}
else
{
UBApplication::showMessage(tr("No document selected!"));
showMessage(tr("No document selected!"));
}
}
......@@ -917,7 +922,7 @@ void UBDocumentController::importFile()
if (groupName == UBSettings::defaultDocumentGroupName || fileInfo.suffix() != "ubz")
groupName = "";
UBApplication::showMessage(tr("Importing file %1...").arg(fileInfo.baseName()), true);
showMessage(tr("Importing file %1...").arg(fileInfo.baseName()), true);
createdDocument = docManager->importFile(selectedFile, groupName);
......@@ -927,7 +932,7 @@ void UBDocumentController::importFile()
}
else
{
UBApplication::showMessage(tr("Failed to import file ... "));
showMessage(tr("Failed to import file ... "));
}
}
......@@ -958,7 +963,7 @@ void UBDocumentController::addFolderOfImages()
if (importedImageNumber == 0)
{
UBApplication::showMessage(tr("Folder does not contain any image files!"));
showMessage(tr("Folder does not contain any image files!"));
UBApplication::applicationController->showDocument();
}
else
......@@ -1003,7 +1008,7 @@ bool UBDocumentController::addFileToDocument(UBDocumentProxy* document)
QApplication::processEvents();
QFile selectedFile(filePath);
UBApplication::showMessage(tr("Importing file %1...").arg(fileInfo.baseName()), true);
showMessage(tr("Importing file %1...").arg(fileInfo.baseName()), true);
success = UBDocumentManager::documentManager()->addFileToDocument(document, selectedFile);
......@@ -1014,7 +1019,7 @@ bool UBDocumentController::addFileToDocument(UBDocumentProxy* document)
}
else
{
UBApplication::showMessage(tr("Failed to import file ... "));
showMessage(tr("Failed to import file ... "));
}
}
......@@ -1382,13 +1387,19 @@ bool UBDocumentController::isOKToOpenDocument(UBDocumentProxy* proxy)
void UBDocumentController::showMessage(const QString& message, bool showSpinningWheel)
{
int margin = UBSettings::boardMargin;
QRect newSize = mDocumentUI->thumbnailWidget->geometry();
if (mMessageWindow)
{
mMessageWindow->move(margin, newSize.height() - mMessageWindow->height() - margin);
int margin = UBSettings::boardMargin;
QRect newSize = mDocumentUI->thumbnailWidget->geometry();
#ifdef Q_WS_MACX
QPoint point(newSize.left() + margin, newSize.bottom() - mMessageWindow->height() - margin);
mMessageWindow->move(mDocumentUI->thumbnailWidget->mapToGlobal(point));
#else
mMessageWindow->move(margin, newSize.height() - mMessageWindow->height() - margin);
#endif
mMessageWindow->showMessage(message, showSpinningWheel);
}
}
......@@ -1609,9 +1620,9 @@ void UBDocumentController::refreshDocumentThumbnailsView(UBDocumentContainer*)
QStringList labels;
if (proxy)
if (proxy)
{
setDocument(proxy);
setDocument(proxy);
for (int i = 0; i < selectedDocument()->pageCount(); i++)
{
......
......@@ -71,7 +71,7 @@ class UBDocumentController : public UBDocumentContainer
void selectDocument(UBDocumentProxy* proxy, bool setAsCurrentDocument = true);
void show();
void hide();
void showMessage(const QString& message, bool showSpinningWheel);
void showMessage(const QString& message, bool showSpinningWheel = false);
void hideMessage();
void toggleDocumentToolsPalette();
void cut();
......
/*
* 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();
}
/*
* 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_ */
#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));
}
\ No newline at end of file
#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
/*
* 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
}
......@@ -21,6 +21,9 @@
#include "core/UBApplication.h"
#include "core/UBSettings.h"
#include "board/UBBoardController.h"
#include "board/UBBoardView.h"
#include "domain/UBGraphicsItemDelegate.h"
#include "domain/UBGraphicsScene.h"
#include "domain/UBGraphicsProxyWidget.h"
......@@ -90,14 +93,11 @@ UBGraphicsDelegateFrame::UBGraphicsDelegateFrame(UBGraphicsItemDelegate* pDelega
positionHandles();
this->setAcceptHoverEvents(true);
angleWidget = new UBAngleWidget();
}
UBGraphicsDelegateFrame::~UBGraphicsDelegateFrame()
{
delete angleWidget;
// NOOP
}
......@@ -226,10 +226,46 @@ void UBGraphicsDelegateFrame::mousePressEvent(QGraphicsSceneMouseEvent *event)
mInitialTransform = buildTransform();
mCurrentTool = toolFromPos(event->pos());
setCursorFromAngle(QString(""));
event->accept();
}
void UBGraphicsDelegateFrame::setCursorFromAngle(QString angle)
{
if (mCurrentTool == Rotate)
{
QWidget *controlViewport = UBApplication::boardController->controlView()->viewport();
QSize cursorSize(45,30);
QImage mask_img(cursorSize, 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, cursorSize.width()-1, cursorSize.height()-1, 6, 6);
QBitmap bmpMask = QBitmap::fromImage(mask_img);
QPixmap pixCursor(cursorSize);
pixCursor.fill(QColor(Qt::white));
QPainter painter(&pixCursor);
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
painter.setBrush(QBrush(Qt::white));
painter.setPen(QPen(QColor(Qt::black)));
painter.drawRoundedRect(1,1,cursorSize.width()-2,cursorSize.height()-2,6,6);
painter.setFont(QFont("Arial", 10));
painter.drawText(1,1,cursorSize.width(),cursorSize.height(), Qt::AlignCenter, angle.append(QChar(176)));
painter.end();
pixCursor.setMask(bmpMask);
controlViewport->setCursor(pixCursor);
}
}
bool UBGraphicsDelegateFrame::canResizeBottomRight(qreal width, qreal height, qreal scaleFactor)
{
bool res = false;
......@@ -427,12 +463,7 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
}
}
if (!angleWidget->isVisible())
angleWidget->show();
angleWidget->setText(QString::number((int)mAngle % 360));
angleWidget->update();
setCursorFromAngle(QString::number((int)mAngle % 360));
}
else if (moving())
{
......@@ -525,9 +556,6 @@ QTransform UBGraphicsDelegateFrame::buildTransform()
void UBGraphicsDelegateFrame::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
if (angleWidget->isVisible())
angleWidget->hide();
updateResizeCursors();
mDelegate->commitUndoStep();
......
......@@ -18,7 +18,6 @@
#include <QtGui>
#include "core/UB.h"
#include "domain/UBAngleWidget.h"
class QGraphicsSceneMouseEvent;
class UBGraphicsItemDelegate;
......@@ -65,6 +64,7 @@ class UBGraphicsDelegateFrame: public QGraphicsRectItem, public QObject
inline bool resizingTop () const { return mCurrentTool == ResizeTop; }
inline bool rotating () const { return mCurrentTool == Rotate; }
inline bool moving () const { return mCurrentTool == Move; }
void setCursorFromAngle(QString angle);
bool canResizeBottomRight(qreal width, qreal height, qreal scaleFactor);
QTransform buildTransform ();
......@@ -120,8 +120,5 @@ class UBGraphicsDelegateFrame: public QGraphicsRectItem, public QObject
bool mResizing;
bool mMirroredXAtStart;
bool mMirroredYAtStart;
UBAngleWidget *angleWidget;
};
#endif /* UBGRAPHICSDELEGATEFRAME_H_ */
......@@ -37,7 +37,6 @@
#include "UBGraphicsWidgetItem.h"
#include "domain/UBAbstractWidget.h"
#include "domain/UBGraphicsTextItem.h"
#include "domain/UBGraphicsMediaItem.h"
#include "domain/UBGraphicsGroupContainerItem.h"
......@@ -107,12 +106,12 @@ UBGraphicsItemDelegate::UBGraphicsItemDelegate(QGraphicsItem* pDelegated, QObjec
, mFrame(0)
, mFrameWidth(UBSettings::settings()->objectFrameWidth)
, mAntiScaleRatio(1.0)
, mToolBarItem(NULL)
, mCanRotate(canRotate)
, mCanDuplicate(true)
, mRespectRatio(respectRatio)
, mMimeData(NULL)
, mFlippable(false)
, mToolBarItem(NULL)
, mToolBarUsed(useToolBar)
{
// NOOP
......@@ -379,7 +378,14 @@ void UBGraphicsItemDelegate::setZOrderButtonsVisible(bool visible)
void UBGraphicsItemDelegate::remove(bool canUndo)
{
// QGraphicsScene* scene = mDelegated->scene();
/*UBGraphicsScene* scene = dynamic_cast<UBGraphicsScene*>(mDelegated->scene());
if (scene && canUndo)
{
UBGraphicsItemUndoCommand *uc = new UBGraphicsItemUndoCommand(scene, mDelegated, 0);
UBApplication::undoStack->push(uc);
}
mDelegated->hide(); */
UBGraphicsScene* scene = dynamic_cast<UBGraphicsScene*>(mDelegated->scene());
if (scene)
{
......@@ -387,11 +393,17 @@ void UBGraphicsItemDelegate::remove(bool canUndo)
scene->removeItem(button);
scene->removeItem(mFrame);
/* this is performed because when removing delegated from scene while it contains flash content, segfault happens because of QGraphicsScene::removeItem() */
UBGraphicsWebView *mDelegated_casted = dynamic_cast<UBGraphicsWebView*>(mDelegated);
if (mDelegated_casted)
mDelegated_casted->setHtml(QString());
scene->removeItem(mDelegated);
if (canUndo)
{
UBGraphicsItemUndoCommand *uc = new UBGraphicsItemUndoCommand((UBGraphicsScene*) scene, mDelegated, 0);
UBGraphicsItemUndoCommand *uc = new UBGraphicsItemUndoCommand(scene, mDelegated, 0);
UBApplication::undoStack->push(uc);
}
}
......@@ -406,10 +418,6 @@ bool UBGraphicsItemDelegate::isLocked()
void UBGraphicsItemDelegate::duplicate()
{
// TODO UB 4.x .. rewrite .. .this is absurde ... we know what we are duplicating
UBApplication::boardController->copy();
UBApplication::boardController->paste();
UBApplication::boardController->duplicateItem(dynamic_cast<UBItem*>(delegated()));
}
......@@ -1075,11 +1083,11 @@ void MediaTimer::display(const QString &s)
void MediaTimer::setNumDigits(int numDigits)
{
if (numDigits > 99) {
qWarning("QLCDNumber::setNumDigits: (%s) Max 99 digits allowed");
qWarning("QLCDNumber::setNumDigits: Max 99 digits allowed");
numDigits = 99;
}
if (numDigits < 0) {
qWarning("QLCDNumber::setNumDigits: (%s) Min 0 digits allowed");
qWarning("QLCDNumber::setNumDigits: Min 0 digits allowed");
numDigits = 0;
}
if (digitStr.isNull()) { // from constructor
......@@ -1181,8 +1189,6 @@ void DelegateMediaControl::positionHandles()
mLCDTimerArea.setHeight(parentItem()->boundingRect().height());
lcdTimer->setRect(mLCDTimerArea);
lcdTimer->setPos(mSeecArea.width()-mLCDTimerArea.width(),0);
//lcdTimer->setRect(mLCDTimerArea);
//lcdTimer->setPos(mSeecArea.width()-mLCDTimerArea.width(),0);
mSeecArea.setWidth(rect().width()-mLCDTimerArea.width());
......@@ -1191,8 +1197,6 @@ void DelegateMediaControl::positionHandles()
setRect(selfRect);
lcdTimer->setPos(rect().width() - mLCDTimerArea.width(), 0);
//lcdTimer->setPos(rect().width() - mLCDTimerArea.width(), 0);
}
void DelegateMediaControl::update()
......@@ -1200,7 +1204,6 @@ void DelegateMediaControl::update()
QTime t;
t = t.addMSecs(mCurrentTimeInMs < 0 ? 0 : mCurrentTimeInMs);
lcdTimer->display(t.toString("m:ss"));
//lcdTimer->display(t.toString("m:ss"));
QGraphicsRectItem::update();
}
......@@ -1253,7 +1256,6 @@ void DelegateMediaControl::seekToMousePos(QPointF mousePos)
minX = frameWidth;
length = mSeecArea.width() - lcdTimer->rect().width();
length = mSeecArea.width() /*- lcdTimer->rect().width()*/;
qreal mouseX = mousePos.x();
if (mouseX >= (mSeecArea.width() - mSeecArea.height()/2))
......
......@@ -284,7 +284,7 @@ class UBGraphicsItemDelegate : public QObject
qreal mAntiScaleRatio;
QList<DelegateButton*> mButtons;
QList<DelegateButton*> mToolBarButtons;
UBGraphicsToolBarItem* mToolBarItem;
protected slots:
......
......@@ -54,13 +54,13 @@ bool UBGraphicsMediaItem::sIsMutedByDefault = false;
UBGraphicsMediaItem::UBGraphicsMediaItem(const QUrl& pMediaFileUrl, QGraphicsItem *parent)
: UBGraphicsProxyWidget(parent)
, mVideoWidget(NULL)
, mAudioWidget(NULL)
, mMuted(sIsMutedByDefault)
, mMutedByUserAction(sIsMutedByDefault)
, mMediaFileUrl(pMediaFileUrl)
, mInitialPos(0)
, mVideoWidget(NULL)
, mAudioWidget(NULL)
, mLinkedImage(NULL)
, mInitialPos(0)
{
update();
......
......@@ -139,8 +139,6 @@ private:
QUrl mMediaFileUrl;
QString mMediaSource;
qint64 mInitialPos;
mediaType mMediaType;
bool mShouldMove;
......@@ -149,5 +147,7 @@ private:
bool haveLinkedImage;
QGraphicsPixmapItem *mLinkedImage;
qint64 mInitialPos;
};
#endif // UBGRAPHICSMEDIAITEM_H
......@@ -94,7 +94,7 @@ void UBGraphicsMediaItemDelegate::buildButtons()
connect(mMuteButton, SIGNAL(clicked(bool)), delegated(), SLOT(toggleMute()));
connect(mMuteButton, SIGNAL(clicked(bool)), this, SLOT(toggleMute())); // for changing button image
mButtons << mPlayPauseButton << mStopButton << mMuteButton;
mToolBarButtons << mPlayPauseButton << mStopButton << mMuteButton;
mToolBarItem->setItemsOnToolBar(QList<QGraphicsItem*>() << mPlayPauseButton << mStopButton << mMediaControl << mMuteButton);
mToolBarItem->setVisibleOnBoard(true);
......@@ -156,13 +156,10 @@ void UBGraphicsMediaItemDelegate::positionHandles()
int toolBarMinimumWidth = 0;
int mediaItemWidth = mToolBarItem->boundingRect().width();
foreach (DelegateButton* button, mButtons)
foreach (DelegateButton* button, mToolBarButtons)
{
if (button->getSection() == Qt::TitleBarArea)
{
mediaItemWidth -= button->boundingRect().width() + mToolBarItem->getElementsPadding();
toolBarMinimumWidth += button->boundingRect().width() + mToolBarItem->getElementsPadding();
}
mediaItemWidth -= button->boundingRect().width() + mToolBarItem->getElementsPadding();
toolBarMinimumWidth += button->boundingRect().width() + mToolBarItem->getElementsPadding();
}
toolBarMinimumWidth += mToolBarItem->boundingRect().height();
......@@ -196,8 +193,6 @@ void UBGraphicsMediaItemDelegate::remove(bool canUndo)
QGraphicsScene* scene = mDelegated->scene();
scene->removeItem(mMediaControl);
UBGraphicsItemDelegate::remove(canUndo);
}
......
......@@ -31,6 +31,7 @@
#include "gui/UBMagnifer.h"
#include "gui/UBMainWindow.h"
#include "gui/UBToolWidget.h"
#include "tools/UBGraphicsRuler.h"
#include "tools/UBGraphicsProtractor.h"
......@@ -59,8 +60,6 @@
#include "domain/UBGraphicsGroupContainerItem.h"
#include "UBAppleWidget.h"
#include "UBW3CWidget.h"
#include "UBGraphicsStroke.h"
#include "core/memcheck.h"
......@@ -256,8 +255,8 @@ UBGraphicsScene::UBGraphicsScene(UBDocumentProxy* parent)
, mDocument(parent)
, mDarkBackground(false)
, mCrossedBackground(false)
, mZoomFactor(1)
, mIsDesktopMode(false)
, mZoomFactor(1)
, mIsModified(true)
, mBackgroundObject(0)
, mPreviousWidth(0)
......@@ -1396,7 +1395,7 @@ UBGraphicsMediaItem* UBGraphicsScene::addAudio(const QUrl& pAudioFileUrl, bool s
UBGraphicsWidgetItem* UBGraphicsScene::addWidget(const QUrl& pWidgetUrl, const QPointF& pPos)
{
int widgetType = UBAbstractWidget::widgetType(pWidgetUrl);
int widgetType = UBGraphicsWidgetItem::widgetType(pWidgetUrl);
if(widgetType == UBWidgetType::Apple)
{
......@@ -1422,9 +1421,9 @@ UBGraphicsAppleWidgetItem* UBGraphicsScene::addAppleWidget(const QUrl& pWidgetUr
return appleWidget;
}
UBGraphicsW3CWidgetItem* UBGraphicsScene::addW3CWidget(const QUrl& pWidgetUrl, const QPointF& pPos, int widgetType)
UBGraphicsW3CWidgetItem* UBGraphicsScene::addW3CWidget(const QUrl& pWidgetUrl, const QPointF& pPos)
{
UBGraphicsW3CWidgetItem *w3CWidget = new UBGraphicsW3CWidgetItem(pWidgetUrl, 0, widgetType);
UBGraphicsW3CWidgetItem *w3CWidget = new UBGraphicsW3CWidgetItem(pWidgetUrl, 0);
addGraphicsWidget(w3CWidget, pPos);
......@@ -1444,7 +1443,7 @@ void UBGraphicsScene::addGraphicsWidget(UBGraphicsWidgetItem* graphicsWidget, co
graphicsWidget->setPos(QPointF(pPos.x() - graphicsWidget->boundingRect().width() / 2,
pPos.y() - graphicsWidget->boundingRect().height() / 2));
if (graphicsWidget->widgetWebView()->canBeContent())
if (graphicsWidget->canBeContent())
{
// graphicsWidget->widgetWebView()->loadMainHtml();
......@@ -1464,6 +1463,8 @@ void UBGraphicsScene::addGraphicsWidget(UBGraphicsWidgetItem* graphicsWidget, co
UBApplication::boardController->controlView()->setFocus();
}
UBGraphicsW3CWidgetItem* UBGraphicsScene::addOEmbed(const QUrl& pContentUrl, const QPointF& pPos)
{
QStringList widgetPaths = UBPersistenceManager::persistenceManager()->allWidgets(UBSettings::settings()->applicationApplicationsLibraryDirectory());
......@@ -1978,7 +1979,16 @@ void UBGraphicsScene::addMagnifier(UBMagnifierParams params)
setModified(true);
}
void UBGraphicsScene::moveMagnifier(QPoint newPos)
void UBGraphicsScene::moveMagnifier()
{
if (magniferControlViewWidget)
{
QPoint magnifierPos = QPoint(magniferControlViewWidget->pos().x() + magniferControlViewWidget->size().width() / 2, magniferControlViewWidget->pos().y() + magniferControlViewWidget->size().height() / 2 );
moveMagnifier(magnifierPos, true);
}
}
void UBGraphicsScene::moveMagnifier(QPoint newPos, bool forceGrab)
{
QWidget *cContainer = (QWidget*)(UBApplication::boardController->controlContainer());
QGraphicsView *cView = (QGraphicsView*)UBApplication::boardController->controlView();
......@@ -1986,6 +1996,8 @@ void UBGraphicsScene::moveMagnifier(QPoint newPos)
QPoint dvZeroPoint = dView->mapToGlobal(QPoint(0,0));
QRect qcr = cView->geometry();
QRect qdr = dView->geometry();
int cvW = cView->width();
int dvW = dView->width();
qreal wCoeff = (qreal)dvW / (qreal)cvW;
......@@ -1998,8 +2010,8 @@ void UBGraphicsScene::moveMagnifier(QPoint newPos)
QPoint cvPoint = cView->mapFromGlobal(globalPoint);
QPoint dvPoint( cvPoint.x() * wCoeff + dvZeroPoint.x(), cvPoint.y() * hCoeff + dvZeroPoint.y());
magniferControlViewWidget->grabNMove(globalPoint, globalPoint, false, false);
magniferDisplayViewWidget->grabNMove(globalPoint, dvPoint, false, true);
magniferControlViewWidget->grabNMove(globalPoint, globalPoint, forceGrab, false);
magniferDisplayViewWidget->grabNMove(globalPoint, dvPoint, forceGrab, true);
setModified(true);
}
......
......@@ -35,12 +35,12 @@ class UBGraphicsAudioItem;
class UBGraphicsWidgetItem;
class UBGraphicsW3CWidgetItem;
class UBGraphicsAppleWidgetItem;
class UBToolWidget;
class UBGraphicsPDFItem;
class UBGraphicsTextItem;
class UBGraphicsRuler;
class UBGraphicsProtractor;
class UBGraphicsCompass;
class UBAbstractWidget;
class UBDocumentProxy;
class UBGraphicsCurtainItem;
class UBGraphicsStroke;
......@@ -132,9 +132,11 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem
UBGraphicsWidgetItem* addWidget(const QUrl& pWidgetUrl, const QPointF& pPos = QPointF(0, 0));
UBGraphicsAppleWidgetItem* addAppleWidget(const QUrl& pWidgetUrl, const QPointF& pPos = QPointF(0, 0));
UBGraphicsW3CWidgetItem* addW3CWidget(const QUrl& pWidgetUrl, const QPointF& pPos = QPointF(0, 0),int widgetType = UBGraphicsItemType::W3CWidgetItemType);
UBGraphicsW3CWidgetItem* addW3CWidget(const QUrl& pWidgetUrl, const QPointF& pPos = QPointF(0, 0));
void addGraphicsWidget(UBGraphicsWidgetItem* graphicsWidget, const QPointF& pPos = QPointF(0, 0));
UBGraphicsMediaItem* addMedia(const QUrl& pMediaFileUrl, bool shouldPlayAsap, const QPointF& pPos = QPointF(0, 0));
UBGraphicsMediaItem* addVideo(const QUrl& pVideoFileUrl, bool shouldPlayAsap, const QPointF& pPos = QPointF(0, 0));
UBGraphicsMediaItem* addAudio(const QUrl& pAudioFileUrl, bool shouldPlayAsap, const QPointF& pPos = QPointF(0, 0));
......@@ -324,7 +326,8 @@ public slots:
void selectionChangedProcessing();
void updateGroupButtonState();
void moveMagnifier(QPoint newPos);
void moveMagnifier();
void moveMagnifier(QPoint newPos, bool forceGrab = false);
void closeMagnifier();
void zoomInMagnifier();
void zoomOutMagnifier();
......
#include "UBGraphicsStrokesGroup.h"
#include "domain/UBGraphicsPolygonItem.h"
#include "core/memcheck.h"
UBGraphicsStrokesGroup::UBGraphicsStrokesGroup(QGraphicsItem *parent):QGraphicsItemGroup(parent)
......@@ -63,6 +65,15 @@ UBItem* UBGraphicsStrokesGroup::deepCopy() const
{
UBGraphicsStrokesGroup* copy = new UBGraphicsStrokesGroup();
QList<QGraphicsItem*> chl = childItems();
foreach(QGraphicsItem *child, chl)
{
UBGraphicsPolygonItem *polygon = dynamic_cast<UBGraphicsPolygonItem*>(child);
if (polygon)
copy->addToGroup(dynamic_cast<QGraphicsItem*>(polygon->deepCopy()));
}
copyItemParameters(copy);
return copy;
......
/*
* 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);
}
......@@ -13,24 +13,50 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef UBAPPLEWIDGET_H_
#define UBAPPLEWIDGET_H_
#ifndef UBGRAPHICSWEBVIEW_H_
#define UBGRAPHICSWEBVIEW_H_
#include <QtGui>
#include <QtWebKit>
#include "UBAbstractWidget.h"
#include "UBItem.h"
#include "UBResizableGraphicsItem.h"
class UBItem;
class UBGraphicsItemDelegate;
class UBAppleWidget : public UBAbstractWidget
class UBGraphicsWebView: public QGraphicsWebView, public UBItem, public UBResizableGraphicsItem, public UBGraphicsItem
{
Q_OBJECT;
public:
UBAppleWidget(const QUrl& pWidgetUrl, QWidget *parent = 0);
virtual ~UBAppleWidget();
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 /* UBAPPLEWIDGET_H_ */
#endif /* UBGRAPHICSWEBVIEW_H_ */
......@@ -13,308 +13,652 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "UBGraphicsWidgetItem.h"
#include "api/UBWidgetUniboardAPI.h"
#include "api/UBW3CWidgetAPI.h"
#include <QtNetwork>
#include <QtXml>
#include "UBGraphicsWidgetItem.h"
#include "UBGraphicsScene.h"
#include "UBGraphicsItemDelegate.h"
#include "UBGraphicsWidgetItemDelegate.h"
#include "UBGraphicsDelegateFrame.h"
#include "UBW3CWidget.h"
#include "UBGraphicsScene.h"
#include "UBAppleWidget.h"
#include "frameworks/UBFileSystemUtils.h"
#include "api/UBWidgetUniboardAPI.h"
#include "api/UBW3CWidgetAPI.h"
#include "board/UBBoardController.h"
#include "core/memcheck.h"
#include "core/UBApplicationController.h"
#include "core/UBApplication.h"
#include "core/UBSettings.h"
UBGraphicsWidgetItem::UBGraphicsWidgetItem(QGraphicsItem *parent, int widgetType)
: UBGraphicsProxyWidget(parent)
, mWebKitWidget(0)
#include "frameworks/UBFileSystemUtils.h"
#include "frameworks/UBPlatformUtils.h"
#include "network/UBNetworkAccessManager.h"
#include "web/UBWebPage.h"
#include "web/UBWebKitUtils.h"
#include "web/UBWebController.h"
bool UBGraphicsWidgetItem::sInlineJavaScriptLoaded = false;
QStringList UBGraphicsWidgetItem::sInlineJavaScripts;
UBGraphicsWidgetItem::UBGraphicsWidgetItem(const QUrl &pWidgetUrl, QGraphicsItem *parent)
: UBGraphicsWebView(parent)
, mInitialLoadDone(false)
, mIsFreezable(true)
, mIsResizable(false)
, mLoadIsErronous(false)
, mCanBeContent(0)
, mCanBeTool(0)
, mWidgetUrl(pWidgetUrl)
, mIsFrozen(false)
, mIsTakingSnapshot(false)
, mShouldMoveWidget(false)
, mUniboardAPI(0)
, mUniboardAPI(0)
{
setAcceptDrops(false);
UBGraphicsWidgetItemDelegate* delegate = new UBGraphicsWidgetItemDelegate(this, widgetType);
delegate->init();
setDelegate(delegate);
setData(UBGraphicsItemData::itemLayerType, QVariant(itemLayerType::ObjectItem)); //Necessary to set if we want z value to be assigned correctly
}
QGraphicsWebView::setPage(new UBWebPage(this));
QGraphicsWebView::settings()->setAttribute(QWebSettings::JavaEnabled, true);
QGraphicsWebView::settings()->setAttribute(QWebSettings::PluginsEnabled, true);
QGraphicsWebView::settings()->setAttribute(QWebSettings::LocalStorageDatabaseEnabled, true);
QGraphicsWebView::settings()->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, true);
QGraphicsWebView::settings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true);
QGraphicsWebView::settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard, true);
QGraphicsWebView::settings()->setAttribute(QWebSettings::DnsPrefetchEnabled, true);
UBGraphicsWidgetItem::~UBGraphicsWidgetItem()
{
// NOOP
}
page()->setNetworkAccessManager(UBNetworkAccessManager::defaultAccessManager());
setAcceptDrops(true);
setAutoFillBackground(false);
void UBGraphicsWidgetItem::javaScriptWindowObjectCleared()
{
if(!mUniboardAPI)
mUniboardAPI = new UBWidgetUniboardAPI(scene(), this);
QPalette pagePalette = page()->palette();
pagePalette.setBrush(QPalette::Base, QBrush(Qt::transparent));
pagePalette.setBrush(QPalette::Window, QBrush(Qt::transparent));
page()->setPalette(pagePalette);
mWebKitWidget->page()->mainFrame()->addToJavaScriptWindowObject("sankore", mUniboardAPI);
QPalette viewPalette = palette();
pagePalette.setBrush(QPalette::Base, QBrush(Qt::transparent));
viewPalette.setBrush(QPalette::Window, QBrush(Qt::transparent));
setPalette(viewPalette);
UBGraphicsWidgetItemDelegate* delegate = new UBGraphicsWidgetItemDelegate(this);
delegate->init();
setDelegate(delegate);
}
void UBGraphicsWidgetItem::setUuid(const QUuid &pUuid)
UBGraphicsWidgetItem::~UBGraphicsWidgetItem()
{
UBItem::setUuid(pUuid);
setData(UBGraphicsItemData::ItemUuid, QVariant(pUuid)); //store item uuid inside the QGraphicsItem to fast operations with Items on the scene
/* NOOP */
}
void UBGraphicsWidgetItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
void UBGraphicsWidgetItem::initialize()
{
UBGraphicsProxyWidget::mousePressEvent(event);
installEventFilter(this);
UBGraphicsWebView::setMinimumSize(nominalSize());
setData(UBGraphicsItemData::itemLayerType, QVariant(itemLayerType::ObjectItem)); // Necessary to set if we want z value to be assigned correctly
// did webkit consume the mouse press ?
mShouldMoveWidget = !event->isAccepted() && (event->buttons() & Qt::LeftButton);
if (mDelegate && mDelegate->frame() && resizable())
mDelegate->frame()->setOperationMode(UBGraphicsDelegateFrame::Resizing);
mLastMousePos = mapToScene(event->pos());
QPalette palette = page()->palette();
palette.setBrush(QPalette::Base, QBrush(Qt::transparent));
page()->setPalette(palette);
page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);
event->accept();
connect(page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(javaScriptWindowObjectCleared()));
connect(page(), SIGNAL(geometryChangeRequested(const QRect&)), this, SLOT(geometryChangeRequested(const QRect&)));
connect(this, SIGNAL(loadFinished(bool)), this, SLOT(mainFrameLoadFinished (bool)));
connect(page(), SIGNAL(linkClicked(const QUrl&)), this, SLOT(onLinkClicked(const QUrl&)));
}
void UBGraphicsWidgetItem::onLinkClicked(const QUrl& url){
UBApplication::webController->loadUrl(url);
}
void UBGraphicsWidgetItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
QUrl UBGraphicsWidgetItem::mainHtml()
{
mShouldMoveWidget = false;
UBGraphicsProxyWidget::mouseReleaseEvent(event);
return mMainHtmlUrl;
}
void UBGraphicsWidgetItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
void UBGraphicsWidgetItem::loadMainHtml()
{
sendJSEnterEvent();
mDelegate->hoverEnterEvent(event);
UBGraphicsProxyWidget::hoverEnterEvent(event);
mInitialLoadDone = false;
load(mMainHtmlUrl);
}
void UBGraphicsWidgetItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
QUrl UBGraphicsWidgetItem::widgetUrl()
{
sendJSLeaveEvent();
mDelegate->hoverLeaveEvent(event);
UBGraphicsProxyWidget::hoverLeaveEvent(event);
return mWidgetUrl;
}
void UBGraphicsWidgetItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
QString UBGraphicsWidgetItem::mainHtmlFileName()
{
UBGraphicsProxyWidget::hoverMoveEvent(event);
return mMainHtmlFileName;
}
bool UBGraphicsWidgetItem::eventFilter(QObject *obj, QEvent *event)
bool UBGraphicsWidgetItem::hasEmbededObjects()
{
if (mShouldMoveWidget && obj == mWebKitWidget && event->type() == QEvent::MouseMove)
{
QMouseEvent *mouseMoveEvent = static_cast<QMouseEvent*>(event);
if (page()->mainFrame()) {
QList<UBWebKitUtils::HtmlObject> htmlObjects = UBWebKitUtils::objectsInFrame(page()->mainFrame());
return htmlObjects.length() > 0;
}
if (mouseMoveEvent->buttons() & Qt::LeftButton)
{
QPointF scenePos = mapToScene(mouseMoveEvent->pos());
return false;
}
QPointF newPos = pos() + scenePos - mLastMousePos;
bool UBGraphicsWidgetItem::hasEmbededFlash()
{
if (hasEmbededObjects())
return page()->mainFrame()->toHtml().contains("application/x-shockwave-flash");
else
return false;
}
setPos(newPos);
bool UBGraphicsWidgetItem::canBeContent()
{
// if we under MAC OS
#if defined(Q_OS_MAC)
return mCanBeContent & UBGraphicsWidgetItem::type_MAC;
#endif
// if we under UNIX OS
#if defined(Q_OS_UNIX)
return mCanBeContent & UBGraphicsWidgetItem::type_UNIX;
#endif
// if we under WINDOWS OS
#if defined(Q_OS_WIN)
return mCanBeContent & UBGraphicsWidgetItem::type_WIN;
#endif
}
mLastMousePos = scenePos;
bool UBGraphicsWidgetItem::canBeTool()
{
// if we under MAC OS
#if defined(Q_OS_MAC)
return mCanBeTool & UBGraphicsWidgetItem::type_MAC;
#endif
// if we under UNIX OS
#if defined(Q_OS_UNIX)
return mCanBeTool & UBGraphicsWidgetItem::type_UNIX;
#endif
// if we under WINDOWS OS
#if defined(Q_OS_WIN)
return mCanBeTool & UBGraphicsWidgetItem::type_WIN;
#endif
}
event->accept();
QString UBGraphicsWidgetItem::preference(const QString& key) const
{
return mPreferences.value(key);
}
return true;
}
}
void UBGraphicsWidgetItem::setPreference(const QString& key, QString value)
{
if (key == "" || (mPreferences.contains(key) && mPreferences.value(key) == value))
return;
//standard event processing
return QObject::eventFilter(obj, event);
mPreferences.insert(key, value);
if (scene())
scene()->setModified(true);
}
void UBGraphicsWidgetItem::resize ( qreal w, qreal h )
QMap<QString, QString> UBGraphicsWidgetItem::preferences() const
{
UBGraphicsProxyWidget::resize(w, h);
mWebKitWidget->resize(w, h);
return mPreferences;
}
void UBGraphicsWidgetItem::resize ( const QSizeF & size )
void UBGraphicsWidgetItem::removePreference(const QString& key)
{
resize(size.width(), size.height());
mPreferences.remove(key);
}
void UBGraphicsWidgetItem::geometryChangeRequested(const QRect& geom)
void UBGraphicsWidgetItem::removeAllPreferences()
{
resize(geom.width(), geom.height());
mPreferences.clear();
}
void UBGraphicsWidgetItem::initialize()
QString UBGraphicsWidgetItem::datastoreEntry(const QString& key) const
{
connect(mWebKitWidget->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(javaScriptWindowObjectCleared()));
if (mDatastore.contains(key))
return mDatastore.value(key);
else
return QString();
}
QPalette palette = mWebKitWidget->page()->palette();
palette.setBrush(QPalette::Base, QBrush(Qt::transparent));
mWebKitWidget->page()->setPalette(palette);
void UBGraphicsWidgetItem::setDatastoreEntry(const QString& key, QString value)
{
if (key == "" || (mDatastore.contains(key) && mDatastore.value(key) == value))
return;
UBGraphicsProxyWidget::setWidget(mWebKitWidget);
mDatastore.insert(key, value);
if (scene())
scene()->setModified(true);
}
mWebKitWidget->installEventFilter(this);
QMap<QString, QString> UBGraphicsWidgetItem::datastoreEntries() const
{
return mDatastore;
}
UBGraphicsProxyWidget::setMinimumSize(mWebKitWidget->nominalSize());
connect(mWebKitWidget, SIGNAL(geometryChangeRequested(const QRect&)), this, SLOT(geometryChangeRequested(const QRect&)));
void UBGraphicsWidgetItem::removeDatastoreEntry(const QString& key)
{
mDatastore.remove(key);
}
if (mDelegate && mDelegate->frame() && mWebKitWidget->resizable())
mDelegate->frame()->setOperationMode(UBGraphicsDelegateFrame::Resizing);
setData(UBGraphicsItemData::itemLayerType, QVariant(itemLayerType::ObjectItem)); //Necessary to set if we want z value to be assigned correctly
void UBGraphicsWidgetItem::removeAllDatastoreEntries()
{
mDatastore.clear();
}
UBGraphicsItemDelegate* UBGraphicsWidgetItem::Delegate() const
{
return mDelegate;
}
UBGraphicsScene* UBGraphicsWidgetItem::scene()
void UBGraphicsWidgetItem::remove()
{
return qobject_cast<UBGraphicsScene*>(QGraphicsItem::scene());
if (mDelegate)
mDelegate->remove();
}
void UBGraphicsWidgetItem::removeScript()
{
if (page() && page()->mainFrame())
page()->mainFrame()->evaluateJavaScript("if(widget && widget.onremove) { widget.onremove();}");
}
UBAbstractWidget* UBGraphicsWidgetItem::widgetWebView()
void UBGraphicsWidgetItem::processDropEvent(QDropEvent *event)
{
return mUniboardAPI->ProcessDropEvent(event);
}
bool UBGraphicsWidgetItem::isDropableData(const QMimeData *data) const
{
return mWebKitWidget;
return mUniboardAPI->isDropableData(data);
}
QUrl UBGraphicsWidgetItem::getOwnFolder() const {
return ownFolder;
}
void UBGraphicsWidgetItem::setPreference(const QString& key, QString value)
void UBGraphicsWidgetItem::setOwnFolder(const QUrl &newFolder)
{
if (key == "" || (mPreferences.contains(key) && mPreferences.value(key) == value))
return;
mPreferences.insert(key, value);
if (scene())
scene()->setModified(true);
ownFolder = newFolder;
}
void UBGraphicsWidgetItem::setSnapshotPath(const QUrl &newFilePath)
{
SnapshotFile = newFilePath;
}
QString UBGraphicsWidgetItem::preference(const QString& key) const
QUrl UBGraphicsWidgetItem::getSnapshotPath()
{
return mPreferences.value(key);
return SnapshotFile;
}
void UBGraphicsWidgetItem::clearSource()
{
UBFileSystemUtils::deleteDir(getOwnFolder().toLocalFile());
UBFileSystemUtils::deleteFile(getSnapshotPath().toLocalFile());
}
QMap<QString, QString> UBGraphicsWidgetItem::preferences() const
void UBGraphicsWidgetItem::setUuid(const QUuid &pUuid)
{
return mPreferences;
UBItem::setUuid(pUuid);
setData(UBGraphicsItemData::ItemUuid, QVariant(pUuid)); //store item uuid inside the QGraphicsItem to fast operations with Items on the scene
}
QSize UBGraphicsWidgetItem::nominalSize() const
{
return mNominalSize;
}
void UBGraphicsWidgetItem::removePreference(const QString& key)
bool UBGraphicsWidgetItem::hasLoadedSuccessfully() const
{
mPreferences.remove(key);
return (mInitialLoadDone && !mLoadIsErronous);
}
bool UBGraphicsWidgetItem::freezable()
{
return mIsFreezable;
}
void UBGraphicsWidgetItem::removeAllPreferences()
{
mPreferences.clear();
bool UBGraphicsWidgetItem::resizable()
{
return mIsResizable;
}
bool UBGraphicsWidgetItem::isFrozen()
{
return mIsFrozen;
}
QPixmap UBGraphicsWidgetItem::snapshot()
{
return mSnapshot;
}
void UBGraphicsWidgetItem::setDatastoreEntry(const QString& key, QString value)
QPixmap UBGraphicsWidgetItem::takeSnapshot()
{
if (key == "" || (mDatastore.contains(key) && mDatastore.value(key) == value))
return;
mIsTakingSnapshot = true;
mDatastore.insert(key, value);
if (scene())
scene()->setModified(true);
}
QPixmap pixmap(size().toSize());
pixmap.fill(Qt::transparent);
QPainter painter(&pixmap);
QStyleOptionGraphicsItem options;
paint(&painter, &options);
mIsTakingSnapshot = false;
QString UBGraphicsWidgetItem::datastoreEntry(const QString& key) const
return pixmap;
}
void UBGraphicsWidgetItem::setSnapshot(const QPixmap& pix)
{
if (mDatastore.contains(key))
return mDatastore.value(key);
else
return "";
mSnapshot = pix;
}
UBGraphicsScene* UBGraphicsWidgetItem::scene()
{
return qobject_cast<UBGraphicsScene*>(QGraphicsItem::scene());
}
QMap<QString, QString> UBGraphicsWidgetItem::datastoreEntries() const
int UBGraphicsWidgetItem::widgetType(const QUrl& pUrl)
{
return mDatastore;
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;
}
QString UBGraphicsWidgetItem::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;
void UBGraphicsWidgetItem::removeDatastoreEntry(const QString& key)
if (name.length() > 0) {
result = name;
if (version.length() > 0) {
result += " ";
result += version;
}
}
return result;
}
QString UBGraphicsWidgetItem::iconFilePath(const QUrl& pUrl)
{
mDatastore.remove(key);
/* 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;
}
void UBGraphicsWidgetItem::freeze()
{
QPixmap pix = takeSnapshot();
mIsFrozen = true;
setSnapshot(pix);
}
void UBGraphicsWidgetItem::removeAllDatastoreEntries()
void UBGraphicsWidgetItem::unFreeze()
{
mDatastore.clear();
mIsFrozen = false;
}
void UBGraphicsWidgetItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
UBGraphicsWebView::mousePressEvent(event);
void UBGraphicsWidgetItem::remove()
// did webkit consume the mouse press ?
mShouldMoveWidget = !event->isAccepted() && (event->buttons() & Qt::LeftButton);
mLastMousePos = mapToScene(event->pos());
event->accept();
}
void UBGraphicsWidgetItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
mShouldMoveWidget = false;
if (mDelegate)
mDelegate->remove();
UBGraphicsWebView::mouseReleaseEvent(event);
}
void UBGraphicsWidgetItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
{
sendJSEnterEvent();
mDelegate->hoverEnterEvent(event);
UBGraphicsWebView::hoverEnterEvent(event);
}
void UBGraphicsWidgetItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
{
sendJSLeaveEvent();
mDelegate->hoverLeaveEvent(event);
UBGraphicsWebView::hoverLeaveEvent(event);
}
void UBGraphicsWidgetItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
{
UBGraphicsWebView::hoverMoveEvent(event);
}
void UBGraphicsWidgetItem::removeScript()
bool UBGraphicsWidgetItem::eventFilter(QObject *obj, QEvent *event)
{
if (mWebKitWidget && mWebKitWidget->page() && mWebKitWidget->page()->mainFrame())
{
mWebKitWidget->page()->mainFrame()->evaluateJavaScript("if(widget && widget.onremove) { widget.onremove();}");
if (mShouldMoveWidget && obj == this && event->type() == QEvent::MouseMove) {
QMouseEvent *mouseMoveEvent = static_cast<QMouseEvent*>(event);
if (mouseMoveEvent->buttons() & Qt::LeftButton) {
QPointF scenePos = mapToScene(mouseMoveEvent->pos());
QPointF newPos = pos() + scenePos - mLastMousePos;
setPos(newPos);
mLastMousePos = scenePos;
event->accept();
return true;
}
}
/* standard event processing */
return QObject::eventFilter(obj, event);
}
void UBGraphicsWidgetItem::sendJSEnterEvent()
{
if (mWebKitWidget && mWebKitWidget->page() && mWebKitWidget->page()->mainFrame())
{
mWebKitWidget->page()->mainFrame()->evaluateJavaScript("if(widget && widget.onenter) { widget.onenter();}");
}
if (page() && page()->mainFrame())
page()->mainFrame()->evaluateJavaScript("if(widget && widget.onenter) { widget.onenter();}");
}
void UBGraphicsWidgetItem::sendJSLeaveEvent()
{
if (mWebKitWidget && mWebKitWidget->page() && mWebKitWidget->page()->mainFrame())
{
mWebKitWidget->page()->mainFrame()->evaluateJavaScript("if(widget && widget.onleave) { widget.onleave();}");
if (page() && page()->mainFrame())
page()->mainFrame()->evaluateJavaScript("if(widget && widget.onleave) { widget.onleave();}");
}
void UBGraphicsWidgetItem::injectInlineJavaScript()
{
if (!sInlineJavaScriptLoaded) {
sInlineJavaScripts = UBApplication::applicationController->widgetInlineJavaScripts();
sInlineJavaScriptLoaded = true;
}
foreach(QString script, sInlineJavaScripts)
page()->mainFrame()->evaluateJavaScript(script);
}
void UBGraphicsWidgetItem::clearSource()
void UBGraphicsWidgetItem::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
UBFileSystemUtils::deleteDir(getOwnFolder().toLocalFile());
UBFileSystemUtils::deleteFile(getSnapshotPath().toLocalFile());
if (mIsFrozen)
painter->drawPixmap(0, 0, mSnapshot);
else
UBGraphicsWebView::paint(painter, option, widget);
if (!mInitialLoadDone || mLoadIsErronous) {
QString message;
if (mInitialLoadDone && mLoadIsErronous)
message = tr("Cannot load content");
else
message = tr("Loading ...");
painter->setFont(QFont("Arial", 12));
QFontMetrics fm = painter->fontMetrics();
QRect txtBoundingRect = fm.boundingRect(message);
txtBoundingRect.moveCenter(rect().center().toPoint());
txtBoundingRect.adjust(-10, -5, 10, 5);
painter->setPen(Qt::NoPen);
painter->setBrush(UBSettings::paletteColor);
painter->drawRoundedRect(txtBoundingRect, 3, 3);
painter->setPen(Qt::white);
painter->drawText(rect(), Qt::AlignCenter, message);
}
}
void UBGraphicsWidgetItem::processDropEvent(QDropEvent *event)
void UBGraphicsWidgetItem::geometryChangeRequested(const QRect& geom)
{
return mUniboardAPI->ProcessDropEvent(event);
resize(geom.width(), geom.height());
}
bool UBGraphicsWidgetItem::isDropableData(const QMimeData *data) const
void UBGraphicsWidgetItem::javaScriptWindowObjectCleared()
{
return mUniboardAPI->isDropableData(data);
injectInlineJavaScript();
if(!mUniboardAPI)
mUniboardAPI = new UBWidgetUniboardAPI(scene(), this);
page()->mainFrame()->addToJavaScriptWindowObject("sankore", mUniboardAPI);
}
UBGraphicsAppleWidgetItem::UBGraphicsAppleWidgetItem(const QUrl& pWidgetUrl, QGraphicsItem *parent)
: UBGraphicsWidgetItem(parent)
void UBGraphicsWidgetItem::mainFrameLoadFinished (bool ok)
{
mWebKitWidget = new UBAppleWidget(pWidgetUrl, 0);
initialize();
mInitialLoadDone = true;
mLoadIsErronous = !ok;
update(boundingRect());
}
UBGraphicsAppleWidgetItem::UBGraphicsAppleWidgetItem(UBAppleWidget *appleWidget, QGraphicsItem *parent)
: UBGraphicsWidgetItem(parent)
UBGraphicsAppleWidgetItem::UBGraphicsAppleWidgetItem(const QUrl& pWidgetUrl, QGraphicsItem *parent)
: UBGraphicsWidgetItem(pWidgetUrl, parent)
{
mWebKitWidget = appleWidget;
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);
load(mMainHtmlUrl);
QPixmap defaultPixmap(pWidgetUrl.toLocalFile() + "/Default.png");
setMaximumSize(defaultPixmap.size());
mNominalSize = defaultPixmap.size();
initialize();
}
......@@ -322,13 +666,23 @@ UBGraphicsAppleWidgetItem::UBGraphicsAppleWidgetItem(UBAppleWidget *appleWidget,
UBGraphicsAppleWidgetItem::~UBGraphicsAppleWidgetItem()
{
// NOOP
/* NOOP */
}
int UBGraphicsAppleWidgetItem::type() const
{
return Type;
}
void UBGraphicsAppleWidgetItem::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
}
UBItem* UBGraphicsAppleWidgetItem::deepCopy() const
{
UBGraphicsAppleWidgetItem *appleWidget = new UBGraphicsAppleWidgetItem(mWebKitWidget->widgetUrl(), parentItem());
UBGraphicsAppleWidgetItem *appleWidget = new UBGraphicsAppleWidgetItem(QGraphicsWebView::url(), parentItem());
copyItemParameters(appleWidget);
......@@ -355,38 +709,183 @@ void UBGraphicsAppleWidgetItem::copyItemParameters(UBItem *copy) const
}
}
void UBGraphicsAppleWidgetItem::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
}
UBGraphicsW3CWidgetItem::UBGraphicsW3CWidgetItem(const QUrl& pWidgetUrl, QGraphicsItem *parent, int widgetType)
: UBGraphicsWidgetItem(parent, widgetType)
bool UBGraphicsW3CWidgetItem::sTemplateLoaded = false;
QString UBGraphicsW3CWidgetItem::sNPAPIWrappperConfigTemplate;
QMap<QString, QString> UBGraphicsW3CWidgetItem::sNPAPIWrapperTemplates;
UBGraphicsW3CWidgetItem::UBGraphicsW3CWidgetItem(const QUrl& pWidgetUrl, QGraphicsItem *parent)
: UBGraphicsWidgetItem(pWidgetUrl, parent)
, mW3CWidgetAPI(0)
{
mW3CWidget = new UBW3CWidget(pWidgetUrl, 0);
mWebKitWidget = mW3CWidget;
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 = UBGraphicsWidgetItem::type_ALL;
if (roles.contains("twin"))
mCanBeTool |= UBGraphicsWidgetItem::type_WIN;
if (roles.contains("tmac"))
mCanBeTool |= UBGraphicsWidgetItem::type_MAC;
if (roles.contains("tunix"))
mCanBeTool |= UBGraphicsWidgetItem::type_UNIX;
/* --------- */
if (roles == "" || roles.contains("content"))
mCanBeContent = UBGraphicsWidgetItem::type_ALL;
if (roles.contains("cwin"))
mCanBeContent |= UBGraphicsWidgetItem::type_WIN;
if (roles.contains("cmac"))
mCanBeContent |= UBGraphicsWidgetItem::type_MAC;
if (roles.contains("cunix"))
mCanBeContent |= UBGraphicsWidgetItem::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", QLocale::system());
mMetadatas.description = textForSubElementByLocale(widgetElement, "description ", QLocale::system());
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()));
load(mMainHtmlUrl);
setMaximumSize(QSize(width, height));
mNominalSize = QSize(width, height);
initialize();
setOwnFolder(pWidgetUrl);
}
UBGraphicsW3CWidgetItem::UBGraphicsW3CWidgetItem(UBW3CWidget *w3cWidget, QGraphicsItem *parent, int widgetType)
: UBGraphicsWidgetItem(parent)
, mW3CWidget(w3cWidget)
, mW3CWidgetAPI(0)
UBGraphicsW3CWidgetItem::~UBGraphicsW3CWidgetItem()
{
Q_UNUSED(widgetType);
mWebKitWidget = mW3CWidget;
initialize();
/* NOOP */
}
int UBGraphicsW3CWidgetItem::type() const
{
return Type;
}
UBGraphicsW3CWidgetItem::~UBGraphicsW3CWidgetItem()
void UBGraphicsW3CWidgetItem::setUuid(const QUuid &pUuid)
{
// NOOP
UBItem::setUuid(pUuid);
setData(UBGraphicsItemData::ItemUuid, QVariant(pUuid)); //store item uuid inside the QGraphicsItem to fast operations with Items on the scene
}
UBItem* UBGraphicsW3CWidgetItem::deepCopy() const
{
UBGraphicsW3CWidgetItem *copy = new UBGraphicsW3CWidgetItem(mWidgetUrl, parentItem());
copy->setUuid(this->uuid()); // this is OK for now as long as Widgets are imutable
copyItemParameters(copy);
return copy;
}
void UBGraphicsW3CWidgetItem::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
{
......@@ -395,23 +894,222 @@ void UBGraphicsW3CWidgetItem::paint(QPainter * painter, const QStyleOptionGraphi
if (scene())
rc = scene()->renderingContext();
if ((!w3cWidget()->hasLoadedSuccessfully()) && (rc == UBGraphicsScene::NonScreen || rc == UBGraphicsScene::PdfExport))
{
if (!w3cWidget()->snapshot().isNull())
{
painter->drawPixmap(0, 0, w3cWidget()->snapshot());
if (rc == UBGraphicsScene::NonScreen || rc == UBGraphicsScene::PdfExport) {
if (!snapshot().isNull())
painter->drawPixmap(0, 0, snapshot());
}
else
UBGraphicsWidgetItem::paint(painter, option, widget);
}
QMap<QString, UBGraphicsW3CWidgetItem::PreferenceValue> UBGraphicsW3CWidgetItem::preferences()
{
return mPreferences;
}
UBGraphicsW3CWidgetItem::Metadata UBGraphicsW3CWidgetItem::metadatas() const
{
return mMetadatas;
}
QString UBGraphicsW3CWidgetItem::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 UBGraphicsW3CWidgetItem::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 QString();
}
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 QString();
}
QTextStream outIndex(&indexFile);
outIndex.setCodec("UTF-8");
outIndex << htmlTemplate;
indexFile.close();
return widgetLibraryPath;
}
else
{
UBGraphicsProxyWidget::paint(painter, option, widget);
return QString();
}
QString UBGraphicsW3CWidgetItem::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 QString();
}
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 UBGraphicsW3CWidgetItem::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 = QString();
}
}
}
return defaultcontent;
}
void UBGraphicsW3CWidgetItem::setUuid(const QUuid &pUuid)
QString UBGraphicsW3CWidgetItem::freezedWidgetFilePath()
{
UBItem::setUuid(pUuid);
setData(UBGraphicsItemData::ItemUuid, QVariant(pUuid)); //store item uuid inside the QGraphicsItem to fast operations with Items on the scene
return UBPlatformUtils::applicationResourcesDirectory() + "/etc/" + "freezedWidgetWrapper.html";
}
bool UBGraphicsW3CWidgetItem::hasNPAPIWrapper(const QString& pMimeType)
{
loadNPAPIWrappersTemplates();
return sNPAPIWrapperTemplates.contains(pMimeType);
}
void UBGraphicsW3CWidgetItem::javaScriptWindowObjectCleared()
......@@ -421,30 +1119,71 @@ void UBGraphicsW3CWidgetItem::javaScriptWindowObjectCleared()
if(!mW3CWidgetAPI)
mW3CWidgetAPI = new UBW3CWidgetAPI(this);
mWebKitWidget->page()->mainFrame()->addToJavaScriptWindowObject("widget", mW3CWidgetAPI);
page()->mainFrame()->addToJavaScriptWindowObject("widget", mW3CWidgetAPI);
}
UBW3CWidget::Metadata UBGraphicsW3CWidgetItem::metadatas() const
void UBGraphicsW3CWidgetItem::loadNPAPIWrappersTemplates()
{
return mW3CWidget->metadatas();
}
if (!sTemplateLoaded) {
sNPAPIWrapperTemplates.clear();
QString etcPath = UBPlatformUtils::applicationResourcesDirectory() + "/etc/";
UBW3CWidget* UBGraphicsW3CWidgetItem::w3cWidget() const
{
return mW3CWidget;
}
QDir etcDir(etcPath);
foreach(QString fileName, etcDir.entryList()) {
if (fileName.startsWith("npapi-wrapper") && (fileName.endsWith(".htm") || fileName.endsWith(".html"))) {
UBItem* UBGraphicsW3CWidgetItem::deepCopy() const
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 UBGraphicsW3CWidgetItem::textForSubElementByLocale(QDomElement rootElement, QString subTagName, QLocale locale)
{
UBGraphicsW3CWidgetItem *copy = new UBGraphicsW3CWidgetItem(mWebKitWidget->widgetUrl(), parentItem());
copy->setUuid(this->uuid()); // this is OK for now as long as Widgets are imutable
copyItemParameters(copy);
QDomNodeList subList = rootElement.elementsByTagName(subTagName);
return copy;
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 QString();
}
void UBGraphicsW3CWidgetItem::copyItemParameters(UBItem *copy) const
......@@ -462,9 +1201,9 @@ void UBGraphicsW3CWidgetItem::copyItemParameters(UBItem *copy) const
cp->resize(this->size());
foreach(QString key, mPreferences.keys())
foreach(QString key, UBGraphicsWidgetItem::preferences().keys())
{
cp->setPreference(key, mPreferences.value(key));
cp->setPreference(key, UBGraphicsWidgetItem::preferences().value(key));
}
foreach(QString key, mDatastore.keys())
......@@ -472,4 +1211,5 @@ void UBGraphicsW3CWidgetItem::copyItemParameters(UBItem *copy) const
cp->setDatastoreEntry(key, mDatastore.value(key));
}
}
}
\ No newline at end of file
}
......@@ -17,100 +17,156 @@
#include <QtGui>
#include <QtWebKit>
#include <QDomElement>
#include "core/UB.h"
#include "UBGraphicsWebView.h"
#include "UBGraphicsProxyWidget.h"
#include "UBW3CWidget.h"
#include "UBAppleWidget.h"
#include "core/UB.h"
class UBWidgetUniboardAPI;
class UBGraphicsScene;
class UBAbstractWidget;
class UBW3CWidgetAPI;
class UBW3CWidgetWebStorageAPI;
class UBGraphiscItem;
class UBGraphiscItemDelegate;
class UBGraphicsWidgetItem : public UBGraphicsProxyWidget
struct UBWidgetType
{
enum Enum
{
W3C = 0, Apple, Other
};
};
class UBGraphicsWidgetItem : public UBGraphicsWebView
{
Q_OBJECT
public:
UBGraphicsWidgetItem(QGraphicsItem *parent = 0, int widgetType = 0);
UBGraphicsWidgetItem(const QUrl &pWidgetUrl = QUrl(), QGraphicsItem *parent = 0);
~UBGraphicsWidgetItem();
virtual UBGraphicsScene* scene();
UBAbstractWidget* widgetWebView();
virtual void initialize();
virtual UBItem* deepCopy() const = 0;
QUrl mainHtml();
void loadMainHtml();
QUrl widgetUrl();
QString mainHtmlFileName();
virtual void resize ( qreal w, qreal h );
virtual void resize ( const QSizeF & size );
bool hasEmbededObjects();
bool hasEmbededFlash();
bool canBeContent();
bool canBeTool();
void setPreference(const QString& key, QString value);
QString preference(const QString& key) const;
void setPreference(const QString& key, QString value);
QMap<QString, QString> preferences() const;
void removePreference(const QString& key);
void removeAllPreferences();
void setDatastoreEntry(const QString& key, QString value);
QString datastoreEntry(const QString& key) const;
void setDatastoreEntry(const QString& key, QString value);
QMap<QString, QString> datastoreEntries() const;
void removeDatastoreEntry(const QString& key);
void removeAllDatastoreEntries();
virtual UBGraphicsItemDelegate* Delegate() const {return mDelegate; }
virtual UBGraphicsItemDelegate* Delegate() const;
virtual void remove();
void removeScript();
QString downloadUrl(const QString &fileUrl, const QString &extention);
QString downloadWeb(const QString &fileUrl);
void processDropEvent(QDropEvent *event);
bool isDropableData(const QMimeData *data) const;
virtual void setOwnFolder(const QUrl &newFolder) {ownFolder = newFolder;}
virtual QUrl getOwnFolder() const {return ownFolder;}
virtual void setSnapshotPath(const QUrl &newFilePath){SnapshotFile = newFilePath;}
virtual QUrl getSnapshotPath(){return SnapshotFile;}
virtual QUrl getOwnFolder() const;
virtual void setOwnFolder(const QUrl &newFolder);
virtual void setSnapshotPath(const QUrl &newFilePath);
virtual QUrl getSnapshotPath();
virtual void clearSource();
virtual void setUuid(const QUuid &pUuid);
QSize nominalSize() const;
bool hasLoadedSuccessfully() const;
bool freezable();
bool resizable();
bool isFrozen();
QPixmap snapshot();
void setSnapshot(const QPixmap& pix);
QPixmap takeSnapshot();
virtual UBItem* deepCopy() const = 0;
virtual UBGraphicsScene* scene();
static int widgetType(const QUrl& pUrl);
static QString widgetName(const QUrl& pUrl);
static QString iconFilePath(const QUrl& pUrl);
public slots:
void freeze();
void unFreeze();
protected:
enum OSType
{
type_NONE = 0, // 0000
type_WIN = 1, // 0001
type_MAC = 2, // 0010
type_UNIX = 4, // 0100
type_ALL = 7, // 0111
};
bool mFirstReleaseAfterMove;
bool mInitialLoadDone;
bool mIsFreezable;
bool mIsResizable;
bool mLoadIsErronous;
bool mMouseIsPressed;
int mCanBeContent;
int mCanBeTool;
QSize mNominalSize;
QString mMainHtmlFileName;
QUrl mMainHtmlUrl;
QUrl mWidgetUrl;
QMap<QString, QString> mDatastore;
QMap<QString, QString> mPreferences;
virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
virtual void hoverMoveEvent(QGraphicsSceneHoverEvent *event);
virtual bool eventFilter(QObject *obj, QEvent *event);
virtual void sendJSEnterEvent();
virtual void sendJSLeaveEvent();
UBAbstractWidget* mWebKitWidget;
QMap<QString, QString> mPreferences;
QMap<QString, QString> mDatastore;
virtual void injectInlineJavaScript();
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
protected slots:
void geometryChangeRequested(const QRect& geom);
virtual void javaScriptWindowObjectCleared();
void mainFrameLoadFinished(bool ok);
private slots:
void onLinkClicked(const QUrl& url);
private:
QPointF mLastMousePos;
bool mShouldMoveWidget;
bool mIsFrozen;
bool mIsTakingSnapshot;
bool mShouldMoveWidget;
UBWidgetUniboardAPI* mUniboardAPI;
QPixmap mSnapshot;
QPointF mLastMousePos;
QUrl ownFolder;
QUrl SnapshotFile;
QUrl SnapshotFile;
static bool sInlineJavaScriptLoaded;
static QStringList sInlineJavaScripts;
};
class UBGraphicsAppleWidgetItem : public UBGraphicsWidgetItem
......@@ -119,21 +175,17 @@ class UBGraphicsAppleWidgetItem : public UBGraphicsWidgetItem
public:
UBGraphicsAppleWidgetItem(const QUrl& pWidgetUrl, QGraphicsItem *parent = 0);
UBGraphicsAppleWidgetItem(UBAppleWidget *appleWidget, QGraphicsItem *parent = 0);
~UBGraphicsAppleWidgetItem();
enum { Type = UBGraphicsItemType::AppleWidgetItemType };
virtual int type() const
{
return Type;
}
virtual UBItem* deepCopy() const;
~UBGraphicsAppleWidgetItem();
virtual void copyItemParameters(UBItem *copy) const;
virtual int type() const;
virtual void setUuid(const QUuid &pUuid);
virtual UBItem* deepCopy() const;
enum
{
Type = UBGraphicsItemType::AppleWidgetItemType
};
};
......@@ -142,38 +194,76 @@ class UBGraphicsW3CWidgetItem : public UBGraphicsWidgetItem
Q_OBJECT
public:
UBGraphicsW3CWidgetItem(const QUrl& pWidgetUrl, QGraphicsItem *parent = 0, int widgetType = UBGraphicsItemType::W3CWidgetItemType);
UBGraphicsW3CWidgetItem(UBW3CWidget *w3cWidget, QGraphicsItem *parent = 0, int widgetType = UBGraphicsItemType::W3CWidgetItemType);
~UBGraphicsW3CWidgetItem();
class PreferenceValue
{
public:
enum { Type = UBGraphicsItemType::W3CWidgetItemType };
PreferenceValue()
{
/* NOOP */
}
virtual int type() const
{
return Type;
}
PreferenceValue(const QString& pValue, bool pReadonly)
{
value = pValue;
readonly = pReadonly;
}
virtual UBItem* deepCopy() const;
bool readonly;
QString value;
};
class Metadata
{
public:
QString id;
QString name;
QString description;
QString author;
QString authorEmail;
QString authorHref;
QString version;
};
enum
{
Type = UBGraphicsItemType::W3CWidgetItemType
};
UBGraphicsW3CWidgetItem(const QUrl& pWidgetUrl, QGraphicsItem *parent = 0);
~UBGraphicsW3CWidgetItem();
virtual int type() const;
virtual void setUuid(const QUuid &pUuid);
virtual UBItem* deepCopy() const;
virtual void copyItemParameters(UBItem *copy) const;
virtual void paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget );
QMap<QString, PreferenceValue> preferences();
Metadata metadatas() const;
UBW3CWidget::Metadata metadatas() const;
UBW3CWidget* w3cWidget() const;
static QString freezedWidgetFilePath();
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 bool hasNPAPIWrapper(const QString& pMimeType);
virtual void paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget );
virtual void setUuid(const QUuid &pUuid);
Metadata mMetadatas;
private slots:
virtual void javaScriptWindowObjectCleared();
private:
static void loadNPAPIWrappersTemplates();
static QString textForSubElementByLocale(QDomElement rootElement, QString subTagName, QLocale locale);
UBW3CWidget* mW3CWidget;
UBW3CWidgetAPI* mW3CWidgetAPI;
QMap<QString, PreferenceValue> mPreferences;
static bool sTemplateLoaded;
static QString sNPAPIWrappperConfigTemplate;
static QMap<QString, QString> sNPAPIWrapperTemplates;
};
#endif // UBGRAPHICSWIDGETITEM_H
......@@ -55,7 +55,7 @@ void UBGraphicsWidgetItemDelegate::updateMenuActionState()
UBGraphicsItemDelegate::updateMenuActionState();
if (freezeAction)
freezeAction->setChecked(delegated()->widgetWebView()->isFrozen());
freezeAction->setChecked(delegated()->isFrozen());
}
void UBGraphicsWidgetItemDelegate::decorateMenu(QMenu* menu)
......@@ -71,7 +71,7 @@ void UBGraphicsWidgetItemDelegate::decorateMenu(QMenu* menu)
freezeAction->setCheckable(true);
if (delegated()->widgetWebView()->canBeTool())
if (delegated()->canBeTool())
{
setAsToolAction = mMenu->addAction(tr("Transform as Tool "), this, SLOT(pin()));
QIcon pinIcon;
......@@ -86,11 +86,11 @@ void UBGraphicsWidgetItemDelegate::freeze(bool frozen)
{
if(frozen)
{
delegated()->widgetWebView()->freeze();
delegated()->freeze();
}
else
{
delegated()->widgetWebView()->unFreeze();
delegated()->unFreeze();
}
}
......
/*
* 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 "";
}
/*
* 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_ */
......@@ -7,26 +7,23 @@ HEADERS += src/domain/UBGraphicsScene.h \
src/domain/UBDocumentUndoCommand.h \
src/domain/UBPageSizeUndoCommand.h \
src/domain/UBGraphicsProxyWidget.h \
src/domain/UBGraphicsWebView.h \
src/domain/UBGraphicsSvgItem.h \
src/domain/UBGraphicsPolygonItem.h \
src/domain/UBItem.h \
src/domain/UBGraphicsWidgetItem.h \
src/domain/UBAppleWidget.h \
src/domain/UBGraphicsPDFItem.h \
src/domain/UBGraphicsTextItem.h \
src/domain/UBAbstractWidget.h \
src/domain/UBW3CWidget.h \
src/domain/UBResizableGraphicsItem.h \
src/domain/UBGraphicsStroke.h \
src/domain/UBGraphicsMediaItem.h \
src/domain/UBAbstractUndoCommand.h\
src/domain/UBAngleWidget.h \
src/domain/UBGraphicsGroupContainerItem.h \
src/domain/UBGraphicsGroupContainerItemDelegate.h \
src/domain/UBGraphicsStrokesGroup.h
src/domain/UBGraphicsMediaItem.h \
src/domain/UBAbstractUndoCommand.h\
src/domain/UBGraphicsGroupContainerItem.h \
src/domain/UBGraphicsGroupContainerItemDelegate.h \
src/domain/UBGraphicsStrokesGroup.h
HEADERS += src/domain/UBGraphicsItemDelegate.h \
src/domain/UBGraphicsTextItemDelegate.h \
src/domain/UBGraphicsTextItemDelegate.h \
src/domain/UBGraphicsDelegateFrame.h \
src/domain/UBGraphicsWidgetItemDelegate.h \
src/domain/UBGraphicsMediaItemDelegate.h
......@@ -40,27 +37,24 @@ SOURCES += src/domain/UBGraphicsScene.cpp \
src/domain/UBDocumentUndoCommand.cpp \
src/domain/UBPageSizeUndoCommand.cpp \
src/domain/UBGraphicsProxyWidget.cpp \
src/domain/UBGraphicsWebView.cpp \
src/domain/UBGraphicsSvgItem.cpp \
src/domain/UBGraphicsPolygonItem.cpp \
src/domain/UBItem.cpp \
src/domain/UBGraphicsVideoItem.cpp \
src/domain/UBGraphicsWidgetItem.cpp \
src/domain/UBAppleWidget.cpp \
src/domain/UBGraphicsPDFItem.cpp \
src/domain/UBGraphicsTextItem.cpp \
src/domain/UBAbstractWidget.cpp \
src/domain/UBW3CWidget.cpp \
src/domain/UBResizableGraphicsItem.cpp \
src/domain/UBGraphicsStroke.cpp \
src/domain/UBGraphicsMediaItem.cpp \
src/domain/UBAbstractUndoCommand.cpp \
src/domain/UBAngleWidget.cpp \
src/domain/ubgraphicsgroupcontaineritem.cpp \
src/domain/ubgraphicsgroupcontaineritemdelegate.cpp \
src/domain/UBGraphicsStrokesGroup.cpp
src/domain/UBGraphicsMediaItem.cpp \
src/domain/UBAbstractUndoCommand.cpp \
src/domain/ubgraphicsgroupcontaineritem.cpp \
src/domain/ubgraphicsgroupcontaineritemdelegate.cpp \
src/domain/UBGraphicsStrokesGroup.cpp
SOURCES += src/domain/UBGraphicsItemDelegate.cpp \
src/domain/UBGraphicsTextItemDelegate.cpp \
src/domain/UBGraphicsTextItemDelegate.cpp \
src/domain/UBGraphicsMediaItemDelegate.cpp \
src/domain/UBGraphicsDelegateFrame.cpp \
src/domain/UBGraphicsWidgetItemDelegate.cpp \
......
......@@ -32,7 +32,7 @@ UBCoreGraphicsScene::~UBCoreGraphicsScene()
//we must delete removed items that are no more in any scene
foreach (const QGraphicsItem* item, mItemsToDelete)
{
if (item->scene()==NULL || item->scene() == this)
if (item->scene() == NULL || item->scene() == this)
{
delete item;
}
......@@ -61,6 +61,7 @@ void UBCoreGraphicsScene::removeItem(QGraphicsItem* item, bool forceDelete)
{
mItemsToDelete.remove(item);
delete item;
item = 0;
}
}
......@@ -84,6 +85,7 @@ bool UBCoreGraphicsScene::deleteItem(QGraphicsItem* item)
mItemsToDelete.remove(item);
delete item;
item = 0;
return true;
}
else
......
......@@ -96,10 +96,6 @@ UBDockPalette::~UBDockPalette()
delete mpLayout;
mpLayout = NULL;
}
if (NULL != mTabPalette) {
delete mTabPalette;
mTabPalette = NULL;
}
}
/**
......@@ -533,6 +529,7 @@ void UBDockPalette::setVisible(bool visible)
bool UBDockPalette::switchMode(eUBDockPaletteWidgetMode mode)
{
mLastOpenedTabForMode.insert(mCurrentMode, mpStackWidget->currentIndex());
mCurrentMode = mode;
bool hasVisibleElements = false;
//-------------------------------//
......@@ -556,7 +553,7 @@ bool UBDockPalette::switchMode(eUBDockPaletteWidgetMode mode)
//-------------------------------//
if(mRegisteredWidgets.size() > 0)
showTabWidget(0);
showTabWidget(mLastOpenedTabForMode.value(mCurrentMode));
update();
......
......@@ -176,6 +176,8 @@ protected:
QVector<UBDockPaletteWidget*> mRegisteredWidgets;
/** The current tab widget */
QString mCrntTabWidget;
/** Last opened tab index depending on mode */
QMap<eUBDockPaletteWidgetMode,int> mLastOpenedTabForMode;
private slots:
void onToolbarPosUpdated();
......
......@@ -18,11 +18,10 @@
#include "core/UBSettings.h"
#include "board/UBBoardController.h"
#include "domain/UBGraphicsWidgetItem.h"
#include "tools/UBToolsManager.h"
#include "domain/UBAbstractWidget.h"
#include "gui/UBMainWindow.h"
#include "core/memcheck.h"
......@@ -67,9 +66,9 @@ UBFavoriteToolPalette::UBFavoriteToolPalette(QWidget* parent)
foreach(QString widgetPath, appPathes)
{
QAction *action = new QAction(UBAbstractWidget::widgetName(QUrl::fromLocalFile(widgetPath)), this);
QAction *action = new QAction(UBGraphicsWidgetItem::widgetName(QUrl::fromLocalFile(widgetPath)), this);
action->setData(QUrl::fromLocalFile(widgetPath));
action->setIcon(QIcon(UBAbstractWidget::iconFilePath(QUrl::fromLocalFile(widgetPath))));
action->setIcon(QIcon(UBGraphicsWidgetItem::iconFilePath(QUrl::fromLocalFile(widgetPath))));
connect(action, SIGNAL(triggered()), this, SLOT(addFavorite()));
toolsActions << action;
......
#include <QDomDocument>
#include "UBFeaturesWidget.h"
#include "domain/UBAbstractWidget.h"
#include "gui/UBThumbnailWidget.h"
#include "frameworks/UBFileSystemUtils.h"
#include "core/UBApplication.h"
......
......@@ -243,6 +243,8 @@ void UBKeyboardPalette::adjustSizeAndPosition(bool pUp)
void UBKeyboardPalette::paintEvent( QPaintEvent* event)
{
checkLayout();
UBActionPalette::paintEvent(event);
QRect r = this->geometry();
......
......@@ -127,6 +127,7 @@ protected:
void init();
private:
QRect originalRect;
......@@ -134,6 +135,11 @@ private:
UBKeyButton** buttons;
UBKeyboardButton** ctrlButtons;
/*
For MacOS: synchronization with system locale.
*/
void checkLayout();
void createCtrlButtons();
void setInput(const UBKeyboardLocale* locale);
......@@ -145,10 +151,6 @@ private:
void* storage;
// Linux-related parameters
int min_keycodes, max_keycodes, byte_per_code;
// Save locale before activation to restore it after (MAC)
QString activeLocale;
};
class UBKeyboardButton : public QWidget
......
......@@ -164,6 +164,9 @@ void UBKeyboardPalette::createCtrlButtons()
}
void UBKeyboardPalette::checkLayout()
{}
void UBKeyboardPalette::onActivated(bool activated)
{
if (activated)
......
......@@ -74,32 +74,35 @@ void SetMacLocaleByIdentifier(const QString& id)
}
}
void UBKeyboardPalette::onActivated(bool activated)
void UBKeyboardPalette::checkLayout()
{
if (activated)
{
TISInputSourceRef selectedLocale = TISCopyCurrentKeyboardInputSource();
CFStringRef sr = (CFStringRef) TISGetInputSourceProperty(selectedLocale,
kTISPropertyInputSourceID);
if (sr!=NULL)
{
char tmp[1024];
CFStringGetCString(sr, tmp, 1024, 0);
activeLocale = tmp;
}
else
activeLocale = "";
TISInputSourceRef selectedLocale = TISCopyCurrentKeyboardInputSource();
onLocaleChanged(locales[nCurrentLocale]);
}
else
{
if (activeLocale != "")
SetMacLocaleByIdentifier(activeLocale);
}
CFStringRef sr = (CFStringRef) TISGetInputSourceProperty(selectedLocale,
kTISPropertyInputSourceID);
if (sr!=NULL)
{
char clId[1024];
CFStringGetCString(sr, clId, 1024, 0);
for(int i=0; i<nLocalesCount;i++)
{
if (locales[i]->id == clId)
{
if (nCurrentLocale!=i)
{
setLocale(i);
}
break;
}
}
}
}
void UBKeyboardPalette::onActivated(bool)
{
}
void UBKeyboardPalette::onLocaleChanged(UBKeyboardLocale* locale)
......
......@@ -64,9 +64,12 @@ void UBKeyboardPalette::createCtrlButtons()
ctrlButtons[ctrlID++] = new UBLocaleButton(this); // Language Switch
}
void UBKeyboardPalette::checkLayout()
{}
void UBKeyboardPalette::onActivated(bool)
{
}
{}
void UBKeyboardPalette::onLocaleChanged(UBKeyboardLocale* )
{}
......@@ -33,8 +33,8 @@ UBRubberBand::UBRubberBand(Shape s, QWidget * p)
: QRubberBand(s, p)
, mResizingMode(None)
, mMouseIsPressed(false)
, mLastPressedPoint(QPoint())
, mResizingBorderHeight(20)
, mLastPressedPoint(QPoint())
{
customStyle = NULL;
......
......@@ -22,6 +22,8 @@
#include <QUrl>
#include <QWebSettings>
#include <QApplication>
#include <QDomElement>
#include <QWebFrame>
#include "UBTeacherGuideWidgetsTools.h"
......@@ -30,7 +32,7 @@
#include "board/UBBoardController.h"
#include "domain/UBW3CWidget.h"
#include "domain/UBGraphicsWidgetItem.h"
#include "globals/UBGlobals.h"
......@@ -360,7 +362,7 @@ void UBTGMediaWidget::removeSource()
void UBTGMediaWidget::hideEvent(QHideEvent* event)
{
if(mpWebView)
mpWebView->page()->mainFrame()->setContent(UBW3CWidget::freezedWidgetPage().toAscii());
mpWebView->page()->mainFrame()->setContent(UBGraphicsW3CWidgetItem::freezedWidgetPage().toAscii());
QWidget::hideEvent(event);
}
......@@ -421,7 +423,7 @@ void UBTGMediaWidget::createWorkWidget()
mMediaType = "w3c";
if(!(mIsPresentationMode || mIsInitializationMode)){
QDir baseW3CDirectory(UBPersistenceManager::persistenceManager()->teacherGuideAbsoluteObjectPath(proxyDocument));
mMediaPath = UBW3CWidget::createNPAPIWrapperInDir(mMediaPath,baseW3CDirectory,mimeType,QSize(100,100),QUuid::createUuid());
mMediaPath = UBGraphicsW3CWidgetItem::createNPAPIWrapperInDir(mMediaPath,baseW3CDirectory,mimeType,QSize(100,100),QUuid::createUuid());
}
mpWebView = new UBDraggableWeb(mMediaPath);
mpWebView->setAcceptDrops(false);
......
......@@ -14,242 +14,213 @@
*/
#include <QtGui>
#include "UBToolWidget.h"
#include "frameworks/UBPlatformUtils.h"
#include "frameworks/UBFileSystemUtils.h"
#include "core/UBApplication.h"
#include "core/UBSettings.h"
#include "domain/UBAbstractWidget.h"
#include "domain/UBAppleWidget.h"
#include "domain/UBW3CWidget.h"
#include "domain/UBGraphicsScene.h"
#include "domain/UBGraphicsWidgetItem.h"
#include "api/UBWidgetUniboardAPI.h"
#include "api/UBW3CWidgetAPI.h"
#include "board/UBBoardController.h"
#include "board/UBBoardView.h"
#include "core/UBApplication.h"
#include "core/UBSettings.h"
#include "domain/UBGraphicsScene.h"
#include "domain/UBGraphicsWidgetItem.h"
#include "frameworks/UBPlatformUtils.h"
#include "frameworks/UBFileSystemUtils.h"
#include "core/memcheck.h"
QPixmap* UBToolWidget::sClosePixmap = 0;
QPixmap* UBToolWidget::sUnpinPixmap = 0;
UBToolWidget::UBToolWidget(const QUrl& pUrl, QWidget* pParent)
: QWidget(pParent, Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint)
, mToolWidget(0)
UBToolWidget::UBToolWidget(const QUrl& pUrl, QGraphicsItem *pParent)
: QGraphicsWidget(pParent, Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint)
, mShouldMoveWidget(false)
, mContentMargin(0)
, mFrameWidth(0)
, mGraphicsWebView(0)
, mGraphicsWidgetItem(0)
{
int widgetType = UBAbstractWidget::widgetType(pUrl);
if(widgetType == UBWidgetType::Apple)
{
mToolWidget = new UBAppleWidget(pUrl, this);
}
else if(widgetType == UBWidgetType::W3C)
{
mToolWidget = new UBW3CWidget(pUrl, this);
}
int widgetType = UBGraphicsWidgetItem::widgetType(pUrl);
if (widgetType == UBWidgetType::Apple)
mGraphicsWidgetItem = new UBGraphicsAppleWidgetItem(pUrl, this);
else if (widgetType == UBWidgetType::W3C)
mGraphicsWidgetItem = new UBGraphicsW3CWidgetItem(pUrl, this);
else
{
qDebug() << "UBToolWidget::UBToolWidget: Unknown widget Type";
return;
}
initialize();
}
UBToolWidget::UBToolWidget(UBAbstractWidget* pWidget, QWidget* pParent)
: QWidget(pParent, Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint)
, mToolWidget(pWidget)
UBToolWidget::UBToolWidget(UBGraphicsWidgetItem *pWidget, QGraphicsItem *pParent)
: QGraphicsWidget(pParent, Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint)
, mShouldMoveWidget(false)
, mContentMargin(0)
, mFrameWidth(0)
, mGraphicsWebView(0)
, mGraphicsWidgetItem(pWidget)
{
mToolWidget->setParent(this);
mToolWidget->loadMainHtml();
initialize();
javaScriptWindowObjectCleared();
}
UBToolWidget::~UBToolWidget()
{
// NOOP
}
void UBToolWidget::initialize()
{
mToolWidget->setAcceptDrops(false);
if(!sClosePixmap)
{
if (!sClosePixmap)
sClosePixmap = new QPixmap(":/images/close.svg");
}
if(!sUnpinPixmap)
{
sUnpinPixmap = new QPixmap(":/images/unpin.svg");
}
mToolWidget->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
mToolWidget->setAttribute(Qt::WA_OpaquePaintEvent, false);
QPalette palette = mToolWidget->page()->palette();
palette.setBrush(QPalette::Base, QBrush(Qt::transparent));
mToolWidget->page()->setPalette(palette);
connect(mToolWidget->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(javaScriptWindowObjectCleared()));
connect(UBApplication::boardController, SIGNAL(activeSceneChanged()), this, SLOT(javaScriptWindowObjectCleared()));
setLayout(new QVBoxLayout());
QGraphicsLinearLayout *graphicsLayout = new QGraphicsLinearLayout(Qt::Vertical);
mFrameWidth = UBSettings::settings()->objectFrameWidth;
mContentMargin = sClosePixmap->width() / 2 + mFrameWidth;
graphicsLayout->setContentsMargins(mContentMargin, mContentMargin, mContentMargin, mContentMargin);
setPreferredSize(mGraphicsWidgetItem->preferredWidth() + mContentMargin * 2, mGraphicsWidgetItem->preferredHeight() + mContentMargin * 2);
layout()->setContentsMargins(mContentMargin, mContentMargin, mContentMargin, mContentMargin);
layout()->addWidget(mToolWidget);
setFixedSize(mToolWidget->width() + mContentMargin * 2, mToolWidget->height() + mContentMargin * 2);
mToolWidget->installEventFilter(this);
}
mGraphicsWebView = new QGraphicsWebView();
connect(mGraphicsWebView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(javaScriptWindowObjectCleared()));
mGraphicsWebView->load(mGraphicsWidgetItem->mainHtml());
graphicsLayout->addItem(mGraphicsWebView);
mGraphicsWebView->setAcceptDrops(false);
mGraphicsWebView->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
mGraphicsWebView->setAttribute(Qt::WA_OpaquePaintEvent, false);
void UBToolWidget::javaScriptWindowObjectCleared()
{
UBWidgetUniboardAPI* uniboardAPI = new UBWidgetUniboardAPI(UBApplication::boardController->activeScene());
QPalette palette = mGraphicsWebView->page()->palette();
palette.setBrush(QPalette::Base, QBrush(Qt::transparent));
mGraphicsWebView->page()->setPalette(palette);
mToolWidget->page()->mainFrame()->addToJavaScriptWindowObject("sankore", uniboardAPI);
setLayout(graphicsLayout);
UBW3CWidget* w3c = dynamic_cast<UBW3CWidget*>(mToolWidget);
if (w3c)
{
UBW3CWidgetAPI* widgetAPI = new UBW3CWidgetAPI(w3c);
mToolWidget->page()->mainFrame()->addToJavaScriptWindowObject("widget", widgetAPI);
}
connect(UBApplication::boardController, SIGNAL(activeSceneChanged()), this, SLOT(javaScriptWindowObjectCleared()));
}
void UBToolWidget::paintEvent(QPaintEvent *event)
bool UBToolWidget::event(QEvent *event)
{
QWidget::paintEvent(event);
if (isActiveWindow())
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::NoPen);
painter.setBrush(QColor(127, 127, 127, 127));
painter.drawRoundedRect(QRectF(sClosePixmap->width() / 2
, sClosePixmap->height() / 2
, width() - sClosePixmap->width()
, mFrameWidth), mFrameWidth / 2, mFrameWidth / 2);
painter.drawPixmap(0, 0, *sClosePixmap);
if (mToolWidget->canBeContent())
painter.drawPixmap(mContentMargin, 0, *sUnpinPixmap);
}
if (event->type() == QEvent::ShortcutOverride)
event->accept();
return QGraphicsWidget::event(event);
}
void UBToolWidget::mousePressEvent ( QMouseEvent * event )
void UBToolWidget::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
QWidget::mousePressEvent(event);
QGraphicsWidget::mousePressEvent(event);
// did webkit consume the mouse press ?
/* did webkit consume the mouse press ? */
mShouldMoveWidget = !event->isAccepted() && (event->buttons() & Qt::LeftButton);
mMousePressPos = event->pos();
event->accept();
update();
}
void UBToolWidget::mouseMoveEvent ( QMouseEvent * event )
void UBToolWidget::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if(mShouldMoveWidget && (event->buttons() & Qt::LeftButton))
{
move(pos() - mMousePressPos + event->pos());
if(mShouldMoveWidget && (event->buttons() & Qt::LeftButton)) {
setPos(pos() - mMousePressPos + event->pos());
event->accept();
}
QWidget::mouseMoveEvent(event);
QGraphicsWidget::mouseMoveEvent(event);
}
void UBToolWidget::mouseReleaseEvent(QMouseEvent * event)
void UBToolWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
mShouldMoveWidget = false;
if (event->pos().x() >= 0 && event->pos().x() < sClosePixmap->width()
&& event->pos().y() >= 0 && event->pos().y() < sClosePixmap->height())
{
UBApplication::boardController->removeTool(this);
if (event->pos().x() >= 0 && event->pos().x() < sClosePixmap->width() && event->pos().y() >= 0 && event->pos().y() < sClosePixmap->height()) {
remove();
event->accept();
}
else if (mToolWidget->canBeContent() && event->pos().x() >= mContentMargin && event->pos().x() < mContentMargin + sUnpinPixmap->width()
&& event->pos().y() >= 0 && event->pos().y() < sUnpinPixmap->height())
{
else if (mGraphicsWidgetItem->canBeContent() && event->pos().x() >= mContentMargin && event->pos().x() < mContentMargin + sUnpinPixmap->width() && event->pos().y() >= 0 && event->pos().y() < sUnpinPixmap->height()) {
UBApplication::boardController->moveToolWidgetToScene(this);
event->accept();
}
else
QWidget::mouseReleaseEvent(event); // don't propgate to parent, the widget is deleted in UBApplication::boardController->removeTool
QGraphicsWidget::mouseReleaseEvent(event); /* don't propgate to parent, the widget is deleted in UBApplication */
}
void UBToolWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QGraphicsWidget::paint(painter, option, widget);
/* painting lightweight toolbar */
if (isActiveWindow()) {
painter->setRenderHint(QPainter::Antialiasing);
painter->setPen(Qt::NoPen);
painter->setBrush(QColor(127, 127, 127, 127));
painter->drawRoundedRect(QRectF(sClosePixmap->width() / 2, sClosePixmap->height() / 2, preferredWidth() - sClosePixmap->width(), mFrameWidth), mFrameWidth / 2, mFrameWidth / 2);
painter->drawPixmap(0, 0, *sClosePixmap);
if (mGraphicsWidgetItem->canBeContent())
painter->drawPixmap(mContentMargin, 0, *sUnpinPixmap);
}
}
bool UBToolWidget::eventFilter(QObject *obj, QEvent *event)
void UBToolWidget::javaScriptWindowObjectCleared()
{
if (mShouldMoveWidget && obj == mToolWidget && event->type() == QEvent::MouseMove)
{
QMouseEvent *mouseMoveEvent = static_cast<QMouseEvent*>(event);
UBWidgetUniboardAPI *uniboardAPI = new UBWidgetUniboardAPI(UBApplication::boardController->activeScene(), mGraphicsWidgetItem);
if (mouseMoveEvent->buttons() & Qt::LeftButton)
{
move(pos() - mMousePressPos + mToolWidget->mapTo(this, mouseMoveEvent->pos()));
mGraphicsWebView->page()->mainFrame()->addToJavaScriptWindowObject("sankore", uniboardAPI);
event->accept();
return true;
}
UBGraphicsW3CWidgetItem *graphicsW3cWidgetItem = dynamic_cast<UBGraphicsW3CWidgetItem*>(mGraphicsWidgetItem);
if (graphicsW3cWidgetItem)
{
UBW3CWidgetAPI* widgetAPI = new UBW3CWidgetAPI(graphicsW3cWidgetItem);
mGraphicsWebView->page()->mainFrame()->addToJavaScriptWindowObject("widget", widgetAPI);
}
}
// standard event processing
return QObject::eventFilter(obj, event);
UBGraphicsWidgetItem* UBToolWidget::graphicsWidgetItem() const
{
return mGraphicsWidgetItem;
}
QPointF UBToolWidget::naturalCenter() const
{
if (mGraphicsWebView)
return mGraphicsWebView->geometry().center();
else
return QPointF(0, 0);
}
void UBToolWidget::centerOn(const QPoint& pos)
void UBToolWidget::centerOn(const QPointF& pos)
{
QWidget::move(pos - QPoint(width() / 2, height() / 2));
QGraphicsWidget::setPos(pos - QPointF(preferredWidth() / 2, preferredHeight() / 2));
}
void UBToolWidget::remove()
{
mGraphicsWebView->setHtml(QString());
scene()->removeItem(this);
}
QPoint UBToolWidget::naturalCenter() const
UBGraphicsScene* UBToolWidget::scene()
{
if (mToolWidget)
return mToolWidget->geometry().center();
else
return QPoint(0, 0);
return qobject_cast<UBGraphicsScene*>(QGraphicsItem::scene());
}
QPointF UBToolWidget::pos() const
{
return QPointF(QGraphicsItem::pos().x() + mContentMargin * scale(), QGraphicsItem::pos().y() + mContentMargin * scale());
}
void UBToolWidget::setPos(const QPointF &point)
{
UBToolWidget::setPos(point.x(), point.y());
}
void UBToolWidget::setPos(qreal x, qreal y)
{
QGraphicsItem::setPos(x - mContentMargin * scale(), y - mContentMargin * scale());
}
UBAbstractWidget* UBToolWidget::webWidget() const
int UBToolWidget::type() const
{
return mToolWidget;
return Type;
}
......@@ -17,52 +17,60 @@
#define UBTOOLWIDGET_H_
#include <QtGui>
#include <QtWebKit>
#include "core/UB.h"
class UBAbstractWidget;
class QWidget;
class UBGraphicsScene;
class UBGraphicsWidgetItem;
class UBToolWidget : public QWidget
class UBToolWidget : public QGraphicsWidget
{
Q_OBJECT;
Q_OBJECT
public:
UBToolWidget(const QUrl& pUrl, QWidget* pParent = 0);
UBToolWidget(UBAbstractWidget* pWidget, QWidget* pParent = 0);
UBToolWidget(const QUrl& pUrl, QGraphicsItem *pParent = 0);
UBToolWidget(UBGraphicsWidgetItem* pGraphicsWidgetItem, QGraphicsItem *pParent = 0);
virtual ~UBToolWidget();
void centerOn(const QPoint& pos);
UBGraphicsWidgetItem* graphicsWidgetItem() const;
QPointF naturalCenter() const;
QPoint naturalCenter() const;
void centerOn(const QPointF& pos);
void remove();
UBAbstractWidget* webWidget() const;
virtual UBGraphicsScene* scene();
virtual QPointF pos() const;
virtual void setPos(const QPointF &point);
virtual void setPos(qreal x, qreal y);
virtual int type() const;
enum
{
Type = UBGraphicsItemType::ToolWidgetItemType
};
protected:
void initialize();
virtual void paintEvent(QPaintEvent *);
virtual void mousePressEvent ( QMouseEvent * event );
virtual void mouseMoveEvent ( QMouseEvent * event );
virtual void mouseReleaseEvent ( QMouseEvent * event );
virtual bool eventFilter(QObject *obj, QEvent *event);
virtual bool event(QEvent *event);
virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
private slots:
void javaScriptWindowObjectCleared();
protected:
static QPixmap *sClosePixmap;
static QPixmap *sUnpinPixmap;
UBAbstractWidget *mToolWidget;
QPoint mMousePressPos;
bool mShouldMoveWidget;
int mContentMargin;
int mFrameWidth;
QGraphicsWebView *mGraphicsWebView;
UBGraphicsWidgetItem *mGraphicsWidgetItem;
QPointF mMousePressPos;
static QPixmap *sClosePixmap;
static QPixmap *sUnpinPixmap;
};
#endif /* UBTOOLWIDGET_H_ */
......@@ -139,7 +139,7 @@ QString UBAudioQueueRecorder::deviceUIDFromDeviceID(AudioDeviceID id)
{
char *cname = new char[1024];
bool result = CFStringGetCString (name, cname, 1024, kCFStringEncodingASCII);
CFStringGetCString (name, cname, 1024, kCFStringEncodingASCII);
int length = CFStringGetLength (name);
uid = QString::fromAscii(cname, length);
......
......@@ -151,7 +151,7 @@ bool UBQuickTimeFile::createCompressionSession()
}
OSStatus err = noErr;
ICMEncodedFrameOutputRecord encodedFrameOutputRecord = {0};
ICMEncodedFrameOutputRecord encodedFrameOutputRecord = {NULL, NULL, NULL};
ICMCompressionSessionOptionsRef sessionOptions = 0;
err = ICMCompressionSessionOptionsCreate(0, &sessionOptions);
......
/*
* 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();
//}
/*
* 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_ */
......@@ -719,15 +719,16 @@ bool UBWebController::isEduMedia(const QUrl& pUrl)
void UBWebController::loadUrl(const QUrl& url)
{
UBApplication::applicationController->showInternet();
if (UBSettings::settings()->webUseExternalBrowser->get().toBool())
{
QDesktopServices::openUrl(url);
}
else
{
UBApplication::applicationController->showInternet();
bool webBrowserAlreadyInstanciated = mStackedWidget->widget(WebBrowser) != NULL;
if (mCurrentWebBrowser && !(*mCurrentWebBrowser)) {
if (!webBrowserAlreadyInstanciated) {
(*mCurrentWebBrowser)->loadUrl(url);
}
else {
......
......@@ -13,7 +13,6 @@ HEADERS += src/web/UBWebController.h \
src/web/UBWebKitUtils.h \
src/web/UBWebPage.h \
src/web/UBWebPluginWidget.h \
src/web/UBRoutedMouseEventWebView.h \
src/web/UBOEmbedParser.h\
src/web/browser/WBBrowserWindow.h \
src/web/browser/WBChaseWidget.h \
......@@ -35,7 +34,6 @@ SOURCES += src/web/UBWebController.cpp \
src/web/UBWebKitUtils.cpp \
src/web/UBWebPage.cpp \
src/web/UBWebPluginWidget.cpp \
src/web/UBRoutedMouseEventWebView.cpp \
src/web/UBOEmbedParser.cpp\
src/web/browser/WBBrowserWindow.cpp \
src/web/browser/WBChaseWidget.cpp \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment