Html程序  |  434行  |  10.24 KB

<!DOCTYPE html>
<html i18n-values="dir:textdirection;">
<head>
<meta charset=UTF-8">
<title i18n-content="title"></title>
<style>
body {
  -webkit-user-select: none;
}

h1 {
  border-bottom: 1px solid #7289E2;
  padding: 8px;
  height: 32px;
  background-image: -webkit-linear-gradient(#D0DAF8, #A6BAF7);
  border: 1px solid #999;
  border-top: 0;
  color: black;
}

html[dir='rtl'] h1 {
  left: auto;
  right: 0;
  background-image: -webkit-linear-gradient(#D0DAF8, #A6BAF7);
}

.rowlink {
  height: 100%;
  -webkit-margin-end: 2px;
}

.devicerow div.icon {
  -webkit-margin-start: 5px;
  margin-top: -3px;
  float: left;
  width: 17px;
  height: 17px;
  background-repeat: no-repeat;
  background: url('shared/images/icon_folder.png');
}

html[dir='rtl'] .devicerow div.icon {
  float: right;
}

.burnicon {
  background:  url('shared/images/filebrowse_menu.png');
  position: absolute;
  right: 4px;
  top: 5px;
  height: 15px;
  width: 15px;
  margin-top: 5px;
  background-repeat: no-repeat;
  cursor: pointer;
  opacity: 0.3;
  -webkit-transition: opacity 0.15s ease-out;
  border: 0;
}

html[dir='rtl'].burnicon {
  right: auto;
  left: 4px;
}

.devicerow:hover .burnicon {
  opacity: 0.75;
  -webkit-transition: none;
}

.devicerow:hover .burnicon:hover {
  opacity: 1;
  -webkit-transition: none;
}

.devicerow {
  border-bottom: 1px solid #f7f7f7;
  padding: 8px 5px 5px 8px;
  font-size: .8em;
  position: relative;
  background-color: #fff;
}

html[dir='rtl'] .devicerow {
  padding: 8px 8px 5px 5px;
}

.devicerow:hover {
  background-color: #ebeff9;
  cursor: pointer;
}

.devicerow span.name {
  margin-top: 10px;
  -webkit-margin-start: 10px;
}

.selected {
  background-color: #b1c8f2;
}

h1.title {
  margin-top: 5px;
  text-align: center;
  font-size: 1.2em;
  font-weight: bold;
}

.columnlist {
  width: 100%;
  bottom: 0;
}

.fullcontainer {
  top: 0px;
  position: absolute;
  left: 0;
  bottom: 0;
  right: 600px;
  -webkit-border-end: 1px solid #7289E2;
}

html[dir='rtl'] .fullcontainer {
  left: 600px;
  right: 0;
}

progress {
  -webkit-margin-start: 15px;
  width: 700px;
}

.progressText {
  -webkit-padding-start: 20px;
  font-size: .6em;
  font: "Helvetica";
}

.statusText {
  padding-top: 5px;
  -webkit-padding-start: 15px;
  font-size: 1em;
}

.statusDiv{
  border-bottom: 1px solid #f7f7f7;
  padding-bottom: 2px;
  background-color: #fff;
}

#rootsColumn:not(.burningColumn) {
  height: 50%;
}

#statusColumn:not(.burningColumn) {
  height: 50%;
  border-top: 1px solid #7289E2;
}
</style>

<script src="shared/js/local_strings.js"></script>
<script>
function $(o) {
  return document.getElementById(o);
}

var currentlySelectedItem;
var currentlySelectedPath;
var localStrings;
var statusMessages;
var burnStarted;

function promptUserDownloadFinished() {
  // This could be done nicer.
  var answer = confirm(localStrings.getString('burnConfirmText1') +
      currentlySelectedPath + localStrings.getString('burnConfirmText2'));
  chrome.send(answer ? 'burnImage' : 'cancelBurnImage', []);
}

function alertUserDownloadAborted(){
  alert(localStrings.getString('downloadAbortedMessage'));
}

function burnSuccessful() {
  alert(localStrings.getString('burnSuccessfulMessage'));
}

function burnUnsuccessful(){
  alert(localStrings.getString('burnUnsuccessfulMessage'));
}

function rootsChanged(){
  chrome.send('getRoots', []);
}

function browseFileResult(info, results) {
  var path = info.path;
  var list = $('rootsList');
  list.innerHTML = '';
  var selectedRemoved = true;
  var addedRoots=[];
  for (var x = 0; x < results.length; x++) {
    if (!(results[x].title in addedRoots)) {
      addedRoots[results[x].title] = true;
      var element = createNewItem(results[x].title, results[x].path);
      if (results[x].path == currentlySelectedPath) {
        selectItem(element.id, results[x].path);
        selectedRemoved = false;
      }
      list.appendChild(element);
    }
  }
  if (selectedRemoved) {
    currentlySelectedItem = null;
    currentlySelectedPath = null;
  }
}

function selectItem(elementId, path) {
  var element = $(elementId);
  var index;
  if (currentlySelectedItem)
    currentlySelectedItem.className = 'devicerow';
  if (element) {
    element.className = 'selected devicerow';
    currentlySelectedItem = element;
    currentlySelectedPath = path;
  }
}

function createProgressElement(id) {
  var statusDiv = document.createElement('div');
  statusDiv.id = id;
  statusDiv.className = 'statusDiv';

  var statusText = document.createElement('div');
  statusText.id = id + 'StatusText';
  statusText.className = 'statusText';
  statusDiv.appendChild(statusText);

  var progressBar = document.createElement('progress');
  progressBar.id = id + 'ProgressBar';
  progressBar.className = 'progressBar';
  statusDiv.appendChild(progressBar);

  var progressText = document.createElement('div');
  progressText.id = id + 'ProgressText';
  progressText.className = 'progressText'
  statusDiv.appendChild(progressText);

  return statusDiv;
}

function setProgressElementFinalValues(element, statuses, event) {
  var statusTextDiv;
  var progressBarDiv;
  var progressTextDiv;
  for (var i = 0; i < element.children.length; i++ ) {
    switch(element.children[i].className) {
      case 'statusText':
        statusTextDiv = element.children[i];
        break;
      case 'progressBar':
        progressBarDiv = element.children[i];
        break;
      case 'progressText':
        progressTextDiv = element.children[i];
        break;
    }
  }
  if (event == 'COMPLETE')
    statusTextDiv.textContent = statuses['finished'];
  else
      statusTextDiv.textContent = statuses['canceled'];

  var progressBarParent = progressBarDiv.parentNode;
  progressBarParent.removeChild(progressBarDiv);

  var progressTextParent = progressTextDiv.parentNode;
  progressTextParent.removeChild(progressTextDiv);
  return element;
}

function setProgressElementValues(element, statuses, amountFinished,
                                  amountTotal, progressText){
  var statusTextDiv;
  var progressBarDiv;
  var progressTextDiv;
  for (var i = 0; i < element.children.length; i++ ) {
    switch(element.children[i].className) {
      case 'statusText':
        statusTextDiv = element.children[i];
        break;
      case 'progressBar':
        progressBarDiv = element.children[i];
        break;
      case 'progressText':
        progressTextDiv = element.children[i];
        break;
    }
  }

  if (!(amountFinished > 0)) {
    amountFinished = 0;
    statusTextDiv.textContent = statuses["start"];
    progressTextDiv.textContent = "";
  } else {
    statusTextDiv.textContent = statuses["inProgress"];
    progressTextDiv.textContent = progressText;
  }
  if(amountFinished > amountTotal)
    amountFinished = amountTotal;
  progressBarDiv.value = amountFinished;
  if (amountTotal)
    progressBarDiv.max = amountTotal;
  return element;
}

function updateProgressElement(progressType, progressInfo) {
  var element = $(progressType + 'ProgressElement');
  if (!element) {
    element = createProgressElement(progressType + 'ProgressElement');
    var column  = $('statusList');
    column.appendChild(element);
  }
  var errorOccurred = (progressInfo.state == 'CANCELLED');
  if (progressInfo.state == 'IN_PROGRESS') {
    setProgressElementValues(element, statusMessages[progressType],
        progressInfo.received, progressInfo.total,
        progressInfo.progress_status_text);
  } else {
    setProgressElementFinalValues(element, statusMessages[progressType],
                                  progressInfo.state);
  }
}

function downloadUpdated(result) {
  updateProgressElement('download', result);
}

function burnProgressUpdated(result) {
  if (!burnStarted) {
    $('rootsList').style.display = 'none';
    $('rootsListTitle').textContent = result.path;
    $('rootsColumn').className = 'burningColumn columnList';
    $('statusColumn').className = 'burningColumn columnList';
    burnStarted = true;
  }
  updateProgressElement('burn', result);
}

var elementIdCounter = 0;

function createNewItem(title, path) {
  var element = document.createElement('div');
  element.className = 'devicerow';
  element.id = path + elementIdCounter;
  elementIdCounter++;
  var link;
  link = document.createElement('div');
  link.onclick = function() { burnImage(element.id, path); };
  link.className = 'rowlink';

  var icon = document.createElement('div');
  icon.className = 'icon';
  link.appendChild(icon);

  var span = document.createElement('span');
  span.className = 'name';
  span.textContent = title;
  link.appendChild(span);

  element.appendChild(link);

  var burnicon = document.createElement('button');
  burnicon.className = 'burnicon';
  burnicon.onclick = function() { burnImage(element.id, path); };
  element.appendChild(burnicon);

  return element;
}

function burnImage(elementId, path) {
  selectItem(elementId, path);
  chrome.send('downloadImage', [path]);
}

function clearList(list) {
  while (list.childNodes.length >= 1) {
    list.removeChild(list.firstChild);
  }
}

document.addEventListener('DOMContentLoaded', function() {
  localStrings = new LocalStrings();
  burnStarted = false;
  chrome.send("getRoots", []);

  // Initialize messages that will be displayed as download
  // or burn progress is updated.
  statusMessages = [];

  var downloadStatuses = [];
  downloadStatuses['start'] = localStrings.getString('downloadStatusStart');
  downloadStatuses['inProgress'] =
      localStrings.getString('downloadStatusInProgress');
  downloadStatuses['finished'] =
      localStrings.getString('downloadStatusComplete');
  downloadStatuses['canceled'] =
      localStrings.getString('downloadStatusCanceled');
  statusMessages['download'] = downloadStatuses;

  var burnStatuses = [];
  burnStatuses['start'] = localStrings.getString('burnStatusStart');
  burnStatuses['inProgress'] = localStrings.getString('burnStatusInProgress');
  burnStatuses['finished'] = localStrings.getString('burnStatusComplete');
  burnStatuses['canceled'] = localStrings.getString('burnStatusCanceled');
  statusMessages['burn'] = burnStatuses;
});
</script>
</head>
<body>
  <div id="main" class="fullcontainer">
    <div id="rootsColumn" class="columnlist">
      <h1 id="rootsListTitle" class="title" i18n-content="listTitle"></h1>
      <div id="rootsList"></div>
    </div>
    <div id="statusColumn" class="columnlist">
      <div id="statusList"></div>
    </div>
  </div>
</body>
</html>